Chapter overview
In this chapter, I focus on the second of my three key questions about the development of representations of mental life: How are the conceptual units that anchor representations of mental life organized in relation to each other, and how does this organization change over development? As in Chapter III, to address this question I draw on data from all of the current studies (Studies 1-4); for details about the methods of these studies, see Chapter II. The goal of this chapter is to provide “snapshots” of the organization of conceptual units in early childhood, middle childhood, and adulthood.
General analysis plan
High-level overview
My goal in this chapter is to examine the relationships among the “conceptual units” identified in Chapter III. How does a participant’s assessment of one conceptual unit for a particular target character (e.g., the degree to which he or she indicates that a beetle is capable of the physiological sensations of the BODY) affect that participant’s assessments of other conceptual units for that target character (e.g., his or her assessment of the beetle’s capaciteis in the domains of HEART or MIND)?
I focus in particular on the possibility that the mental capacity attributions documented by the studies included in this dissertation—re-analyzed as indicators of the broader “conceptual units” identified in Chapter III—might shed light on the hierarchical organization of these conceptual units, i.e., which conceptual units might be more basic or fundamental vs. more complex, and whether any of these conceptual units might or might not be considered to depend on the presence of others. In Chapter II, I illustrated this with the following example: If many participants endorse capacities associated with Conceptual Unit A without endorsing capacities associated with Conceptual Unit B, but very few participants do the reverse (endorsing capacities associated with Conceptual Unit B but not Conceptual Unit A), this provides some evidence that Conceptual Unit A is more basic or fundamental than Conceptual Unit B, or that Conceptual Unit B somehow depends on (perhaps requires) Conceptual Unit A.
Here I will translate this general interest in the relationships among conceptual units, as well as the specific intuition about how to detect the kinds of asymmetries that would be the signature of hierarchical relationships, into a specific analysis plan to be applied to each of these datasets in turn.
Details of analyses
Unlike the previous chapter, in which I employed a canonical approach to identifying latent constructs through analyses of correlation structures—exploratory factor analysis (EFA)—in this chapter there is no tried-and-true method for meeting my analysis goals. Instead, I chart my own course through these datasets, using the EFA solutions reported in Chapter II to score participants’ endorsements of each conceptual unit for the particular target character(s) that they assessed, examining visualizations of the complicated relationships among these endorsements, and then conducting more targeted statistical analyses of one particular aspect of these relationships: the possibility of asymmetries in the endorsements of these conceptual units.
Scoring endorsements of conceptual units
The first step in these analyses is to transform participants’ ratings of individual mental capacities into “scores” that indicate the extent to which they endorsed a particular conceptual unit for the target character(s) that they were assigned to assess. To do this, I make use of the EFAs presented in Chapter II—which originally served to identify a set of conceptual units in a particular sample—to a new end: the construction of “scales” for each of these conceptual units. Scale construction is a common use of EFA and similar dimensionality reduction analyses (if anything, more common than using EFA to make the kinds of theoretical arguments featured in Chapter II).
For each EFA solution, I construct a scale for each of the factors (conceptual units) identified by that solution. First, I sort each of the mental capacities included in that study into categories based on their loadings on each of the factors in that solution. For each mental capacity, I identify the “dominant” factor as the factor with the largest positive factor loading. For example, if the mental capacity feel happy had loadings of 0.60 on the BODY factor, 0.70 on the HEART factor, and 0.30 on the MIND factor, I would sort it into the HEART category. For each factor, I take the six highest-loading items as a candidate scale, then “drop” the capacities with the smallest factor loadings on their respective dominant factors until I have the same number of mental capacities in each category. For example, if the BODY factor were the dominant factor for nine mental capacities, the HEART factor for six mental capacities, and the MIND factor for five capacities, for each factor I would keep only the capacities with the five highest positive loadings on that factor, in order to construct three scales of equal length (and a maximum length of six items).
To calculate scores on these scales, I take the average of all of mental capacities for each scale. This yields a dataset in which each participant is associated with one score for each of the conceptual units identified in the relative EFA solution, for each of the target characters that that participant assessed.
In this chapter, I apply this method to all of the three-factor solutions for adult samples as presented in Chapter II (Studies 1-4), yielding BODY, HEART, and MIND scores for each target character as assessed by each participant. (I ignore the aberrant four-factor solution for adults in Study 2 suggested by one of the three factor retention protocols considered in that chapter, since this was the only study out of the seven considered in which a four-factor solution appeared to add any value beyond the robust BODY-HEART-MIND framework common to all studies. [XX APPENDIX B?])
For child samples, I apply this method both to the solutions emerging from children’s own data and to the corresponding adult solutions for the studies in question. This allows me to explore both the relationships among children’s own conceptual units, and the relationships among a fully adult-like set of conceptual units (presumably, the conceptual units that these children will eventually come to agree on as they mature into adults).
For “older” children (7-9y of age; Studies 2 and 3), this means examining two sets of three conceptual units for each sample of children: (1) BODY, HEART, and MIND as defined by adults in that study; and (2) BODY, HEART, and MIND as defined by the children themselves. Because the EFAs for older children and adults are so similar (see Chapter II), I expect the outcomes of these two approaches to constructing BODY, HEART, and MIND scales to yield very similar results in this age group.
For “younger” children, this means examining multiple sets of conceptual units for each sample of children, including (1) BODY, HEART, and MIND as defined by adults in that study; and (2) varying sets of 2-4 conceptual units as defined by EFA of children’s own responses, using different factor retention protocols. The EFAs of younger children’s responses were less reliable, and less adult-like, than those of older children. As a consequence, I expect the outcomes of these different approaches to constructing scales for each conceptual unit to yield rather different results in this age group.
The reader should note that this is far from the only way to approach “scoring” participants on these conceptual units. In particular, I could have examined factor scores—summaries of each factor (conceptual unit) based on a participant’s responses to all mental capacities and the relationships between all mental capacities and all factors included in that EFA solution—rather than constructing “scales” in the way I have just outlined. However, much like z-scores, factor scores indicate where a participant falls in relation to other participants in the sample, and do not provide the kind of absolute score that is key to my goal in this chapter, which is to analyze relationships among factors in terms of the extent to which individual participants indicated that target characters “possessed” the conceptual units BODY, HEART, and MIND. [XX APPENDIX B?]
Even within the “scale” approach described in this section, there are many parameters of this analysis that I could have set differently. For example, I could have considered absolute factor loadings rather than raw factor loadings, which would allow for mental capacities that loaded especially strongly negatively on a particular factor to contribute (negatively) to scores on that conceptual unit; I could have omitted the step of making the scales for all factors within a single EFA sotluion equal length; I could have chosen to use only the top 4 or 5 mental capacities across all EFA solutions, or to set no limit on the number of items in a scale; or I could have implemented absolute thresholds for how strongly a mental capacity must load on a factor in order to count toward the score for that conceptual unit, or absolute limits on the degree to which a mental capacity can “cross-load” on non-dominant factors and still count toward the score for any one conceptual unit. [XX APPENDIX B?] However, these kinds of details differ quite dramatically across studies and age groups. For example, in some samples there are no strong negative factor loadings, and in others there are; if I considered absolute loadings rather than raw loadings, I could end up comparing scores from a “bipolar” scale in one sample to scores from a “unipolar” scales in another sample, making the comparison more difficult to interpret. Likewise, some EFA solutions tended to feature generally weaker factor loadings than others; if I were to impose absolute thresholds for the strength of factor loadings, I could end up comparing scores from scales of wildly different lengths across samples. In my view, the analysis decisions outlined above maximize comparability across studies and age groups—the primary goal of this chapter. (Note, however, that in the analysis code for this chapter I have included easy short cuts for the interested reader to explore different options for each of these parameters.)
Visualizing relationships
XX
outline:
- for any sample, I have identified relevant conceptual units (chapter II) and scored each participant’s endorsement of each of these units for their assigned target character(s) (previous section)
- now, I want to assess the relationships among these endorsements
- but I don’t really know what to expect, and these relationships could be very complex
- so, start with holistic, exploratory visualization: scatterplots of pairs of conceptual units
Study 1: An adult endpoint
In the context of this dissertation, Study 1 serves the role of describing a developmental endpoint for conceptual representations of mental life. In this chapter, I focus on what these studies can reveal about the relationships among the conceptual units discussed in Chapter III. These analyses were not part of the original publication of these studies (Weisman et al., 2017).
These studies all employed the “edge case” variant of the general approach, with participants assessing the mental capacities of a beetle and/or a robot. (See Chapter II and Weisman et al., 2017, for detailed methods.)
Studies 1a and 1b employed identical methods: US adults (Study 1a: n=405; Study 1b: n=406) each assessed a single target character on 40 mental capacities. Study 1c employed very similar methods, with the exception that participants (n=200) each assessed both target characters side by side (with left-right position counterbalaned across participants).
In Study 1d, 431 US adults each assessed a single target character on 40 mental capacities. Unlike Studies 1a-1c, this study employed the “many characters” variant of the general approach, in which participants were randomly assigned to assess one of the following 21 target characters: an adult, a child, an infant, a person in a persistent vegetative state, a fetus, a chimpanzee, an elephant, a dolphin, a bear, a dog, a goat, a mouse, a frog, a blue jay, a fish, a beetle, a microbe, a robot, a computer, a car, or a stapler.
(See Chapter II and Weisman et al., 2017, for detailed methods.)
Because Studies 1a, 1b, and 1c shared similar methods and yielded similar results both with respect to the conceptual units revealed by EFA (Chapter III) and with respect to the organization of these conceptual units (this chapter), I will discuss these studies as a group before moving on to Study 1d.
Special notes on data processing and analysis
As noted in Chapter II, in the original analysis of these datasets responses were recoded to run from -3 to +3 before analyses (Weisman et al., 2017); in this dissertation, I maintain the 0-6 coding for comparability to Studies 2-4.
Results
Studies 1a-1c
Scale construction
For each of these three studies, following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each, with a large degree of overlap in items across studies; see Table 4.x.
Table 4.x: Scales for each of the conceptual units (factors) identified by EFA for US Adults in Studies 1a-1d (see Chapter III). A checkmark indicates that a mental capacity was included in a scale for a particular study.
| Capacity |
Study 1a |
Study 1b |
Study 1c |
Study 1d |
| BODY scale |
| getting hungry |
✓ |
✓ |
✓ |
✓ |
| experiencing pain |
✓ |
✓ |
✓ |
✓ |
| feeling tired |
✓ |
✓ |
✓ |
✓ |
| experiencing fear |
✓ |
✓ |
✓ |
✓ |
| experiencing pleasure |
✓ |
✓ |
✓ |
✓ |
| having free will |
✓ |
|
|
|
| being conscious |
|
✓ |
|
|
| having desires |
|
|
✓ |
|
| feeling calm |
|
|
|
✓ |
| HEART scale |
| feeling embarrassed |
✓ |
✓ |
✓ |
✓ |
| experiencing pride |
✓ |
✓ |
✓ |
✓ |
| feeling love |
✓ |
✓ |
✓ |
|
| experiencing guilt |
✓ |
✓ |
✓ |
✓ |
| holding beliefs |
✓ |
|
|
✓ |
| feeling disrespected |
✓ |
✓ |
✓ |
✓ |
| feeling depressed |
|
✓ |
✓ |
|
| telling right from wrong |
|
|
|
✓ |
| MIND scale |
| remembering things |
✓ |
✓ |
✓ |
✓ |
| recognizing someone |
✓ |
|
✓ |
|
| sensing temperatures |
✓ |
|
✓ |
✓ |
| communicating with others |
✓ |
✓ |
✓ |
✓ |
| seeing things |
✓ |
✓ |
|
✓ |
| perceiving depth |
✓ |
|
✓ |
✓ |
| detecting sounds |
|
✓ |
✓ |
✓ |
| working toward a goal |
|
✓ |
|
|
| making choices |
|
✓ |
|
|
Visualization
The visualizations of relationships among scores on these BODY, HEART, and MIND scales are remarkably similar across Studies 1a-1c (see Figure 4.x, rows A-C).
BODY vs. HEART
First I will consider the relationship between BODY and HEART (Figure 4.x, leftmost column: panels A1, B1, and C1). To my eyes, the most striking features of these visualizations are that (1) there is a positive relationship between scores on the BODY and HEART scales; and (2) there are virtually no datapoints above the line of equivalence (\(y = x\), dotted diagonal line), and certainly no datapoints in upper left quadrant of these plots. Individual participants tended to endorse the mental capacity items included in the BODY scale at least as strongly, and often more strongly, than they endorsed items included in the HEART scale—in other words, that many participants attributed more BODY than HEART to the target character in question, but virtually no participants attribute more HEART than BODY. This asymmetry appears to have been driven primarily by participants’ assessments of the beetle (in red); for the robot (in blue), BODY and HEART scores may have been more similar (close to the dotted line), and were generally quite low.
BODY vs. MIND
Next I will consider the relationship between BODY and MIND (Figure 4.x, center column: panels A2, B2, and C2). Similar to the BODY vs. HEART comparison, two notable features of these visualizations are that (1) there is a positive relationship between scores on the BODY and MIND scales; and (2) there are fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it, and no datapoints in lower right quadrant of these plots. Most participants tended to endorse the mental capacity items included in the MIND scale roughly as strongly, and sometimes more strongly, than they endorsed items included in the BODY scale, while relatively few particpiants endorsed MIND items less strongly than BODY items (though this asymmetry appears to have been less extreme than the asymmetry between BODY and HEART scores documented in the previous paragraph). In this case, the asymmetry between BODY and MIND appears to have been driven primarily by participants’ assessments of the robot (in blue); for the beetle (in red), BODY and MIND scores appear to have been more similar (close to the dotted line).
HEART vs. MIND
Finally I will consider the relationship between HEART and MIND (Figure 4.x, rightmost column: panels A3, B3, and C3). Again, two features of these visualizations are particularly striking: (1) There is a positive relationship between scores on the MIND and HEART scales; and (2) there are virtually no datapoints below the line of equivalence (\(y = x\), dotted diagonal line). The asymmetry between MIND and HEART scores appears to have been particularly extreme: Almost all participants endorsed the mental capacity items included in the MIND scale more strongly than the items included in the HEART scale. In this case, this asymmetry appears to be born out for both target characters, but perhaps more exaggerated for the beetle (in red) than the robot (in blue).
Interim discussion
Across Studies 1a-1c, all three of the relationships among the conceptual units identified in Chapter III (BODY, HEART, and MIND) appear to be characterized by two features: (1) Positive relationships, such that the more strongly a participant endorsed one conceptual unit, the more strongly they tended to endorse the others; and (2) Robust asymmetries in these positive relationships, such that participants tended to endorse MIND more strongly than BODY or HEART, and HEART more strongly than MIND. Visual inspection suggests that these asymmetries were most pronounced for comparisons involving HEART, with virtually every participant across all three of these studies endorsing both BODY and MIND more strongly than HEART for both of the “edge case” characters included in these studies (a beetle and a robot).

Analysis of asymmetries
Here I provide a formal analysis of the asymmetries revealed by the visualizations in the previous section. For each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND), I used Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the two “edge cases” that were featured as target characters in these studies (a beetle vs a robot), and including maximal random effects structures (in this case, no random effects for Studies 1a and 1b, and random intercepts for participants in Study 1c). See Figure 4.x, panels A-C for visual depictions of these difference scores.
BODY vs. HEART
These regression analyses confirmed that, across Studies 1a-1c, difference scores comparing scores on the BODY and HEART scales were substantially non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.x). As I speculated in the previous section, in all studies this difference was driven by participants’ assessments of the beetle; in the aggregate, difference scores were reduced to 0 for the robot (see the “Target character” row for the “BODY-HEART” comparison in Table 4.x).
BODY vs. MIND
These regression analyses confirmed that, across Studies 1a-1c, difference scores comparing scores on the BODY and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than BODY items (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.x). In all studies this difference was driven by participants’ assessments of the robot; in the aggregate, difference scores were reduced to 0 for the beetle (see the “Target character” row for the “BODY-MIND” comparison in Table 4.x).
HEART vs. MIND
These regression analyses confirmed that, across Studies 1a-1c, difference scores comparing scores on the HEART and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.x). In all studies this difference was somewhat exaggerated in assessments of the robot, relative to the beetle (see the “Target character” row for the “HEART-MIND” comparison in Table 4.x).
Interim discussion
These formal analyses of difference scores across the BODY, HEART, and MIND scales in Studies 1a-1c confirm my information observations of asymmetries described in the previous section: Across studies, participants tended to endorse MIND more strongly than BODY or HEART, and BODY more strongly than HEART.

Table 4.x: Regression analyses of difference scores for US adults in Studies 1a-1c. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included two fixed effect parameters: (1) the intercept, which I treat as an index of the asymmetry in attributions of the two conceptual units in question; and (2) a difference between target characters, reported here as a difference between the robot and the grand mean (GM). Intercepts are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
|
Study 1a |
Study 1b |
Study 1c |
| Parameter |
b |
95% CI |
|
b |
95% CI |
|
b |
95% CI |
|
| BODY - HEART |
| Intercept |
0.22 |
[ 0.20, 0.24] |
* |
0.24 |
[ 0.22, 0.25] |
* |
0.24 |
[ 0.22, 0.26] |
* |
| Robot vs. GM |
-0.22 |
[-0.24, -0.20] |
* |
-0.22 |
[-0.24, -0.21] |
* |
-0.24 |
[-0.25, -0.22] |
* |
| BODY - MIND |
| Intercept |
-0.28 |
[-0.30, -0.26] |
* |
-0.27 |
[-0.29, -0.25] |
* |
-0.27 |
[-0.29, -0.25] |
* |
| Robot vs. GM |
-0.31 |
[-0.33, -0.28] |
* |
-0.28 |
[-0.30, -0.25] |
* |
-0.32 |
[-0.34, -0.29] |
* |
| HEART - MIND |
| Intercept |
-0.50 |
[-0.52, -0.47] |
* |
-0.51 |
[-0.54, -0.48] |
* |
-0.51 |
[-0.54, -0.49] |
* |
| Robot vs. GM |
-0.09 |
[-0.11, -0.06] |
* |
-0.05 |
[-0.08, -0.03] |
* |
-0.08 |
[-0.10, -0.06] |
* |
Study 1d
Scale construction
Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each, with a large degree of overlap in items between these scales and the scales derived from Studies 1a-1c; see Table 4.x.
Visualization
Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.x, row D.
BODY vs. HEART
First I will consider the relationship between BODY and HEART (Figure 4.x, panel D1). Much as in Studies 1a-1c (rows A-C), the most striking features of this visualization are that (1) there is a positive relationship between scores on the BODY and HEART scales; and (2) there are virtually no datapoints above the line of equivalence (\(y = x\), dotted diagonal line), and certainly no datapoints in upper left quadrant. Individual participants tended to endorse the mental capacity items included in the BODY scale at least as strongly, and often more strongly, than they endorsed items included in the HEART scale—in other words, many participants attributed more BODY than HEART to the target character in question, but virtually no participants attributed more HEART than BODY.
An analysis of mean scores by target character further reveals that, in the aggregate, characters that received relatively low BODY scores (e.g., inert objects, technologies, the fetus, the person in a persistant vegetative state, and such “lower” lifeforms as a microbe) received universally low mean HEART scores, while characters that received relatively high BODY scores (e.g., “higher” lifeforms like animals and typical humans) varied in their mean HEART scores. This raises the intriguing possibility that attributions of BODY and HEART may have been govered by some sort of “threshold” model, in which attributions of any substantial amount of HEART depend on the target character having a certain degree of BODY. (This will not be explored further in the current dissertation.)
BODY vs. MIND
Next I will consider the relationship between BODY and MIND (Figure 4.x, panel D2). As in Studies 1a-1c, two notable features of this visualization are that (1) there is a positive relationship between scores on the BODY and MIND scales; and (2) there are datapoints in the upper left but not the lower right quadrants. However, while participants who assessed certain target characters (namely, the technologies) tended to endorse the mental capacity items included in the MIND scale roughly as strongly, and sometimes more strongly, than they endorsed items included in the BODY scale, participants who asssessed other target characters, if anything, appear to have shown the reverse pattern, endorsing MIND items slightly less strongly than BODY items. In other words, there appears to be a less consistency in the “asymmetry” betwen BODY and MIND in Study 1d than there was in Studies 1a-1c.
HEART vs. MIND
Finally I will consider the relationship between HEART and MIND (Figure 4.x, panel D1). Much as in Studies 1a-1c (rows A-C), the most striking features of this visualization are that (1) there is a positive relationship between scores on the HEART and MIND scales; and (2) there are virtually no datapoints below the line of equivalence (\(y = x\), dotted diagonal line), and certainly no datapoints in lower right quadrant. Individual participants tended to endorse the mental capacity items included in the MIND scale at least as strongly, and often more strongly, than they endorsed items included in the HEART scale—in other words, many participants attributed more MIND than HEART to the target character in question, but virtually no participants attributed more HEART than MIND.
An analysis of mean scores by target character further reveals that, in the aggregate, characters that received relatively low MIND scores (e.g., inert objects, the fetus, and such “lower” lifeforms as a microbe) received universally low mean HEART scores, while characters that received relatively high MIND scores (e.g., more sophisticated technologies as well as “higher” lifeforms like animals and typical humans) varied in their mean HEART scores. As in the BODY vs. HEART comparison discussed earlier, this raises the intriguing possibility that attributions of HEART and MIND may have been govered by some sort of “threshold” model, in which attributions of any substantial amount of HEART depend on the target character having a certain degree of MIND. (Again, this will not be explored further in the current dissertation.)
Interim discussion
In Study 1d, many of the observations described for Studies 1a-1c were upheld. In particular, the relationships between BODY vs. HEART and between MIND vs. HEART appear to be characterized by two features: (1) Positive relationships, such that the more strongly a participant endorsed one conceptual unit, the more strongly they tended to endorse the other; and (2) Robust asymmetries in these positive relationships, such that participants tended to endorse either BODY or MIND more strongly than HEART. However, the relationship between BODY vs. MIND appears to be more variable across participants and across target characters than the generally asymmetrical relationship (with participants tending to attribute more MIND than BODY) that emerged in Studies 1a-1c.
Analysis of asymmetries
Here I provide a formal analysis of the asymmetries revealed by the visualizations in the previous section. As in Studies 1a-1c, for each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND), I used Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the twenty-one “diverse characters” that were featured as target characters in these studies. See Figure 4.x, panel D, for visual depictions of these difference scores.
BODY vs. HEART
These regression analyses confirmed that in Study 1d, as in Studies 1a-1c, difference scores comparing scores on the BODY and HEART scales were substantially non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.x).
This asymmetry was more pronounced for some characters (infant, chimpanzee, elephant, dolphin, bear, goat, mouse, frog, blue jay, fish), and less pronounced for others (adult, child, person in a persistant vegetative state (PVS), microbe, robot, computer, car; see the “Target character” row for the “BODY-HEART” comparison in Table 4.x). A full discussion of the differences between target characters is beyond the scope of this chapter.
BODY vs. MIND
These regression analyses indicated that in Study 1d, in contrast to Studies 1a-1c, difference scores comparing scores on the BODY and MIND scales were only very slightly non-zero, in the direction of participants endorsing MIND items more strongly than BODY items (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.x).
Again, this asymmetry was more pronounced for some characters (child, infant, fetus, chimpanzee, bear, dog, goat), and less pronounced for others (microbe, robot, computer, car; see the “Target character” row for the “BODY-MIND” comparison in Table 4.x). A full discussion of the differences between target characters is beyond the scope of this chapter.
HEART vs. MIND
These regression analyses confirmed that in Study 1d, as in Studies 1a-1c, difference scores comparing scores on the HEART and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.x).
Again, this asymmetry was more pronounced for some characters (adult, child, person in a persistant vegetative state (PVS), fetus, microbe, car), and less pronounced for others (infant, dolphin, bear, goat, mouse, frog, blue jay, fish, robot; see the “Target character” row for the “HEART-MIND” comparison in Table 4.x). A full discussion of the differences between target characters is beyond the scope of this chapter.
Interim discussion
These formal analyses of difference scores across the BODY, HEART, and MIND scales in Study 1d confirm my informal observations of asymmetries described in the previous section: In this study, as in Studies 1a-1c above, participants tended to endorse MIND more strongly than BODY or HEART, and BODY more strongly than HEART.
Table 4.x: Regression analyses of difference scores for US adults in Study 1d. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included two fixed effect parameters: (1) the intercept, which I treat as an index of the asymmetry in attributions of the two conceptual units in question; and (2) a difference between target characters, reported here as a difference between each character and the grand mean (GM). Intercepts are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
|
Study 1d |
| Parameter |
b |
95% CI |
|
| BODY - HEART |
| Intercept |
0.35 |
[ 0.33, 0.37] |
* |
| Adult vs. GM |
-0.33 |
[-0.42, -0.24] |
* |
| Child vs. GM |
-0.12 |
[-0.21, -0.04] |
* |
| Infant vs. GM |
0.37 |
[ 0.28, 0.46] |
* |
| PVS vs. GM |
-0.25 |
[-0.34, -0.17] |
* |
| Fetus vs. GM |
-0.04 |
[-0.13, 0.04] |
|
| Chimpanzee vs. GM |
0.10 |
[ 0.02, 0.19] |
* |
| Elephant vs. GM |
0.11 |
[ 0.03, 0.20] |
* |
| Dolphin vs. GM |
0.14 |
[ 0.05, 0.22] |
* |
| Bear vs. GM |
0.22 |
[ 0.13, 0.31] |
* |
| Dog vs. GM |
0.07 |
[-0.01, 0.15] |
|
| Goat vs. GM |
0.23 |
[ 0.15, 0.32] |
* |
| Mouse vs. GM |
0.28 |
[ 0.19, 0.38] |
* |
| Frog vs. GM |
0.31 |
[ 0.22, 0.39] |
* |
| Blue jay vs. GM |
0.30 |
[ 0.21, 0.39] |
* |
| Fish vs. GM |
0.20 |
[ 0.11, 0.29] |
* |
| Beetle vs. GM |
0.05 |
[-0.04, 0.14] |
|
| Microbe vs. GM |
-0.21 |
[-0.30, -0.12] |
* |
| Robot vs. GM |
-0.39 |
[-0.47, -0.30] |
* |
| Computer vs. GM |
-0.36 |
[-0.44, -0.27] |
* |
| Car vs. GM |
-0.35 |
[-0.43, -0.26] |
* |
| BODY - MIND |
| Intercept |
-0.02 |
[-0.04, -0.01] |
* |
| Adult vs. GM |
0.05 |
[-0.02, 0.11] |
|
| Child vs. GM |
0.13 |
[ 0.06, 0.20] |
* |
| Infant vs. GM |
0.26 |
[ 0.19, 0.33] |
* |
| PVS vs. GM |
0.05 |
[-0.02, 0.12] |
|
| Fetus vs. GM |
0.11 |
[ 0.04, 0.18] |
* |
| Chimpanzee vs. GM |
0.11 |
[ 0.04, 0.18] |
* |
| Elephant vs. GM |
0.03 |
[-0.03, 0.10] |
|
| Dolphin vs. GM |
0.03 |
[-0.04, 0.10] |
|
| Bear vs. GM |
0.07 |
[ 0.00, 0.14] |
* |
| Dog vs. GM |
0.12 |
[ 0.06, 0.18] |
* |
| Goat vs. GM |
0.12 |
[ 0.05, 0.19] |
* |
| Mouse vs. GM |
0.07 |
[-0.01, 0.14] |
|
| Frog vs. GM |
0.07 |
[ 0.00, 0.13] |
|
| Blue jay vs. GM |
0.04 |
[-0.03, 0.10] |
|
| Fish vs. GM |
0.03 |
[-0.04, 0.10] |
|
| Beetle vs. GM |
0.00 |
[-0.07, 0.07] |
|
| Microbe vs. GM |
-0.08 |
[-0.15, -0.01] |
* |
| Robot vs. GM |
-0.65 |
[-0.72, -0.58] |
* |
| Computer vs. GM |
-0.40 |
[-0.47, -0.34] |
* |
| Car vs. GM |
-0.18 |
[-0.24, -0.12] |
* |
| HEART - MIND |
| Intercept |
-0.38 |
[-0.40, -0.35] |
* |
| Adult vs. GM |
0.38 |
[ 0.28, 0.47] |
* |
| Child vs. GM |
0.25 |
[ 0.15, 0.35] |
* |
| Infant vs. GM |
-0.12 |
[-0.21, -0.02] |
* |
| PVS vs. GM |
0.30 |
[ 0.21, 0.39] |
* |
| Fetus vs. GM |
0.15 |
[ 0.06, 0.26] |
* |
| Chimpanzee vs. GM |
0.01 |
[-0.09, 0.10] |
|
| Elephant vs. GM |
-0.08 |
[-0.17, 0.02] |
|
| Dolphin vs. GM |
-0.11 |
[-0.20, -0.02] |
* |
| Bear vs. GM |
-0.15 |
[-0.24, -0.05] |
* |
| Dog vs. GM |
0.05 |
[-0.04, 0.13] |
|
| Goat vs. GM |
-0.11 |
[-0.20, -0.02] |
* |
| Mouse vs. GM |
-0.21 |
[-0.32, -0.11] |
* |
| Frog vs. GM |
-0.24 |
[-0.34, -0.14] |
* |
| Blue jay vs. GM |
-0.27 |
[-0.36, -0.18] |
* |
| Fish vs. GM |
-0.17 |
[-0.27, -0.08] |
* |
| Beetle vs. GM |
-0.05 |
[-0.14, 0.05] |
|
| Microbe vs. GM |
0.13 |
[ 0.03, 0.22] |
* |
| Robot vs. GM |
-0.27 |
[-0.36, -0.18] |
* |
| Computer vs. GM |
-0.05 |
[-0.14, 0.05] |
|
| Car vs. GM |
0.17 |
[ 0.08, 0.26] |
* |
Discussion
XX INSERT STUDY 1 DISCUSSION
Study 2: Conceptual change between middle childhood (7-9y) and adulthood
XX INSERT STUDY 2 INTRODUCTION
In Study 2, 200 US adults and 200 US children between the ages of 7.01-9.99 years (median: 8.31y) each assessed a single target character on 40 mental capacities. To make the study appropriate for children in this age range, the wording of some the 40 mental capacities employed in Study 1 was modified to use more age-appropriate vocabulary, and participants responded on a 3-point scale (“no,” coded as 0; “kinda,” coded as 0.5, “yes,” coded as 1). This study employed the “edge case” variant of the general approach, with participants randomly assigned to assess either a beetle or a robot. (See Chapter II for detailed methods.)
Results
Adults
Scale construction
Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.x.
Visualization
Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.x, row A.
BODY vs. HEART
First I will consider the relationship between BODY and HEART (Figure 4.x, panel A1). Much as in Study 1, the most striking features of this visualization are that (1) there is a positive relationship between scores on the BODY and HEART scales; and (2) there are very few datapoints above the line of equivalence (\(y = x\), dotted diagonal line), and certainly no datapoints in upper left quadrant. Individual participants tended to endorse the mental capacity items included in the BODY scale at least as strongly, and often more strongly, than they endorsed items included in the HEART scale—in other words, many participants attributed more BODY than HEART to the target character in question, but virtually no participants attributed more HEART than BODY. As in Studies 1a-1c (which also featured these two “edge cases” as target characters), this asymmetry appears to have been driven primarily by assessments of the beetle (in red), rather than the robot (in blue).
BODY vs. MIND
Next I will consider the relationship between BODY and MIND (Figure 4.x, panel A2). As in Study 1, two notable features of this visualization are that (1) there is a positive relationship between scores on the BODY and MIND scales; and (2) there are fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it, and no datapoints in lower right quadrant. Most participants tended to endorse the mental capacity items included in the MIND scale roughly as strongly, and sometimes more strongly, than they endorsed items included in the BODY scale, while relatively few particpiants endorsed MIND items less strongly than BODY items (though this asymmetry appears to have been less extreme than the asymmetry between BODY and HEART scores documented in the previous paragraph). As in the BODY vs. MIND comparison for Studies 1a-1c (which also featured these two “edge cases” as target characters), the asymmetry between BODY and MIND appears to have been driven primarily by participants’ assessments of the robot (in blue), rather than the beetle (in red).
HEART vs. MIND
Finally I will consider the relationship between HEART and MIND (Figure 4.x, panel A1). As in Study 1, the most striking features of this visualization are that (1) there is a positive relationship between scores on the HEART and MIND scales; and (2) there are virtually no datapoints below the line of equivalence (\(y = x\), dotted diagonal line), and certainly no datapoints in lower right quadrant. Individual participants tended to endorse the mental capacity items included in the MIND scale at least as strongly, and often more strongly, than they endorsed items included in the HEART scale—in other words, many participants attributed more MIND than HEART to the target character in question, but virtually no participants attributed more HEART than MIND. As in the HEART vs. MIND comparison for Studies 1a-1c (which also featured these two “edge cases” as target characters), this asymmetry appears to have been particularly extreme: Almost all participants endorsed the mental capacity items included in the MIND scale more strongly than the items included in the HEART scale. Again, this asymmetry appears to be born out for both target characters, but perhaps more exaggerated for the beetle (in red) than the robot (in blue).
Interim discussion
My informal observations of the relationships among adults’ endorsements of the the conceptual units in Study 2 are very similar to those for adults in Study 1: (1) All of these inter-unit relationships were positive, such that the more strongly a participant endorsed one conceptual unit, the more strongly they tended to endorse the others; and (2) There were robust asymmetries in these positive relationships, such that participants tended to endorse MIND more strongly than BODY or HEART, and HEART more strongly than MIND. As in Studies 1a-1c, visual inspection suggests that these asymmetries were most pronounced for comparisons involving HEART, with virtually every participant across all three of these studies endorsing both BODY and MIND more strongly than HEART for both of the “edge case” characters included in these studies (a beetle and a robot).
Analysis of asymmetries
Here I provide a formal analysis of the asymmetries revealed by the visualizations in the previous section. As in Studies 1a-1c, for each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND), I used Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the two “edge cases” that were featured as target characters in these studies. See Figure 4.x, panel D, for visual depictions of these difference scores.
BODY vs. HEART
As in Study 1, among adults in Study 2, difference scores comparing scores on the BODY and HEART scales were substantially non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.x). As I speculated earlier, this difference was driven by participants’ assessments of the beetle; in the aggregate, difference scores were reduced to 0 for the robot (see the “Target character” row for the “BODY-HEART” comparison in Table 4.x).
BODY vs. MIND
As in Studies 1a-1c (which featured the same “edge cases” as target characters), among adults in Study 2, difference scores comparing scores on the BODY and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than BODY items (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.x). This difference was driven by participants’ assessments of the robot; in the aggregate, difference scores were reduced to 0 for the beetle (see the “Target character” row for the “BODY-MIND” comparison in Table 4.x).
HEART vs. MIND
As in Study 1, among adults in Study 2, difference scores comparing scores on the HEART and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.x). As in Studies 1a-1c, this difference was somewhat exaggerated in assessments of the robot, relative to the beetle (see the “Target character” row for the “HEART-MIND” comparison in Table 4.x).
Interim discussion
These formal analyses of difference scores across the BODY, HEART, and MIND scales among adults in Study 2 confirm my information observations of asymmetries described in the previous section, and align quite closely with analyses of adults in Studies 1a-1c: Across all of these studies, participants tended to endorse MIND more strongly than BODY or HEART, and BODY more strongly than HEART.
Children (7-9y)
XX INSERT SECTION INTRODUCTION/TRANSITION
Visualization
Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.x, row B.
BODY vs. HEART
First I will consider the relationship between BODY and HEART (Figure 4.x, panel B1). As among adults in this study (panel A1), the relationship between scores on the BODY and HEART scales appears to be somewhat positive, and there appear to be somewhat fewer datapoints above the line of equivalence (\(y = x\), dotted diagonal line) than below it—but both of these observations are much less striking among children than they were among adults. In other words, while many children attributed more BODY than HEART to the target character in question (like the vast majority of adults), quite a few children attributed more HEART than BODY. Furthermore, a visual inspection of this plot suggests that the asymmetry may have even gone in opposite directions for the two target characters, with children tending to attribute more BODY than HEART to the beetle (in red) but, if anything, more HEART than BODY to the robot (in blue).
BODY vs. MIND
Next I will consider the relationship between BODY and MIND (Figure 4.x, panel B2). As among adults in this study (panel A2), the relationship between scores on the BODY and MIND scales appears to be somewhat positive, and there appear to be somewhat fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it—but, as in the previous section, both of these observations are much less striking among children than they were among adults. In other words, while many children attributed more MIND than BODY to the target character in question (like the vast majority of adults), quite a few children attributed more BODY than MIND. Furthermore, a visual inspection of this plot suggests that the asymmetry may have even gone in opposite directions for the two target characters, with children tending to attribute more MIND than BODY to the robot (in blue) but, if anything, more BODY than MIND to the beetle (in red).
HEART vs. MIND
Finally I will consider the relationship between HEART and MIND (Figure 4.x, panel B3). As among adults in this study (panel A3), the relationship between scores on the HEART and MIND scales appears to be somewhat positive, and there appear to be somewhat fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it—but, as in the previous sections, both of these observations are much less striking among children than they were among adults. In other words, while many children attributed more MIND than HEART to the target character in question (like the vast majority of adults), quite a few children attributed more HEART than MIND. This appears to have been true for both target characters.
Interim discussion
My informal observations of the relationships among chilrden’s endorsements of the the conceptual units in Study 2 are generally similar to those of adults in this study, but dramatically attenuated: (1) All of these inter-unit relationships were somewaht positive, but only somewhat; and (2) There was some evidence of asymmetries in these positive relationships, but these asymmetries were generally weaker and appeared to be highly dependent on which target character participants assessed (particularly for the BODY vs. HEART and BODY vs. MIND comparisons).
Analysis of asymmetries
Here I provide a formal analysis of the asymmetries revealed by the visualizations in the previous section. As in previous analyses, for each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND), I used Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the two “edge cases” that were featured as target characters in these studies (beetle and robot). See Figure 4.XX, panel B, for visual depictions of these difference scores.
BODY vs. HEART
In contrast to analyses of adults, among children in Study 2 difference scores comparing scores on the BODY and HEART scales were not differentiable from zero (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.x), and the direction of difference varied substantially across target characters (see the “Target character” row for the “BODY-HEART” comparison in Table 4.x).
BODY vs. MIND
As among adults, among children in Study 2 difference scores comparing scores on the BODY and MIND scales were substantially, in the direction of children endorsing MIND items more strongly than BODY items (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.x), and this difference was exaggerated in assessments of the robot (see the “Target character” row for the “BODY-MIND” comparison in Table 4.x).
HEART vs. MIND
As among adults, among adults in Study 2 difference scores comparing scores on the HEART and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.x), and this difference was exaggerated in assessments of the robot(see the “Target character” row for the “HEART-MIND” comparison in Table 4.x).
Interim discussion
These formal analyses of difference scores across the BODY, HEART, and MIND scales among children in Study 2 confirm my informal observations that children generally showed similar patterns of asymmetries to adults—with the notable exception of the BODY vs. HEART comparision, in which children’s responses revealed no consistent asymmetry. In other words, children, like adults, tended to endorse MIND more strongly than BODY or HEART, but did not show a robust adult-like tendency to endorse BODY more strongly than HEART.

Developmental comparison
In the previous sections, I analyzed adults’ and children’s responses separately. Here I conduct a formal comparison of difference scores between conceptual units among these two age groups, to assess the size and robustness of these ostensive developmental differences.
BODY vs. HEART
Difference scores between the BODY and HEART scales were substantially closer to zero among children, as compared to adults (see the “Children vs. adults” row for the “BODY-HEART” comparison in Table 4.x). The difference between target characters did not differ substantially across age groups (see the “Interaction” row for the “BODY-HEART” comparison in Table 4.x).
BODY vs. MIND
Difference scores between the BODY and MIND scales were substantially closer to zero among children, as compared to adults (see the “Children vs. adults” row for the “BODY-MIND” comparison in Table 4.x), and the difference between target characters was attenuated among children (see the “Interaction” row for the “BODY-MIND” comparison in Table 4.x).
HEART vs. MIND
Difference scores between the HEART and MIND scales were substantially closer to zero among children, as compared to adults (see the “Children vs. adults” row for the “HEART-MIND” comparison in Table 4.x), The difference between target characters did not differ substantially across age groups (see the “Interaction” row for the “HEART-MIND” comparison in Table 4.x).
Interim discussion
These formal comparisons of difference scores among children vs. adults in Study 2 confirm my earlier observations that asymmetries were substantially attenuated (and in some cases, reduced to zero) among children, relative to the baseline set by adults. In addition, among children the differences in these asymmetries between the two “edge cases” included in this study (the beetle vs. the robot) were also attenuated, relative to adults; this is in line with my earlier, informal observations that these asymmetries sometimes appeared to reverse in direction across the two target characters.
Children (7-9y), using children’s own scales
XX INSERT TRANSITION
Scale construction
Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.x.
Visualization
Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.x, row B.
BODY vs. HEART
First I will consider the relationship between BODY and HEART (Figure 4.x, panel B1). As among adults in this study (panel A1), the relationship between scores on the BODY and HEART scales appears to be somewhat positive, and there appear to be somewhat fewer datapoints above the line of equivalence (\(y = x\), dotted diagonal line) than below it—but both of these observations are much less striking among children than they were among adults. In other words, while many children attributed more BODY than HEART to the target character in question (like the vast majority of adults), quite a few children attributed more HEART than BODY. Furthermore, a visual inspection of this plot suggests that the asymmetry may have even gone in opposite directions for the two target characters, with children tending to attribute more BODY than HEART to the beetle (in red) but, if anything, more HEART than BODY to the robot (in blue).
BODY vs. MIND
Next I will consider the relationship between BODY and MIND (Figure 4.x, panel B2). As among adults in this study (panel A2), the relationship between scores on the BODY and MIND scales appears to be somewhat positive, and there appear to be somewhat fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it—but, as in the previous section, both of these observations are much less striking among children than they were among adults. In other words, while many children attributed more MIND than BODY to the target character in question (like the vast majority of adults), quite a few children attributed more BODY than MIND. Furthermore, a visual inspection of this plot suggests that the asymmetry may have even gone in opposite directions for the two target characters, with children tending to attribute more MIND than BODY to the robot (in blue) but, if anything, more BODY than MIND to the beetle (in red).
HEART vs. MIND
Finally I will consider the relationship between HEART and MIND (Figure 4.x, panel B3). As among adults in this study (panel A3), the relationship between scores on the HEART and MIND scales appears to be somewhat positive, and there appear to be somewhat fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it—but, as in the previous sections, both of these observations are much less striking among children than they were among adults. In other words, while many children attributed more MIND than HEART to the target character in question (like the vast majority of adults), quite a few children attributed more HEART than MIND. This appears to have been true for both target characters.
Interim discussion
My informal observations of the relationships among chilrden’s endorsements of the the conceptual units in Study 2 are generally similar to those of adults in this study, but dramatically attenuated: (1) All of these inter-unit relationships were somewaht positive, but only somewhat; and (2) There was some evidence of asymmetries in these positive relationships, but these asymmetries were generally weaker and appeared to be highly dependent on which target character participants assessed (particularly for the BODY vs. HEART and BODY vs. MIND comparisons).

Analysis of asymmetries
Here I provide a formal analysis of the asymmetries revealed by the visualizations in the previous section. As in previous analyses, for each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND), I used Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the two “edge cases” that were featured as target characters in these studies (beetle and robot). See Figure 4.XX, panel B, for visual depictions of these difference scores.
BODY vs. HEART
As in analyses using adults’ scales, using children’s own BODY and HEART scales to analyze their data revealed that difference scores between these conceptual units were not differentiable from zero (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.x), and the direction of difference varied substantially across target characters (see the “Target character” row for the “BODY-HEART” comparison in Table 4.x).
BODY vs. MIND
As in analyses using adults’ scales, using children’s own BODY and MIND scales to analyze their data revealed that difference scores between these conceptual units substantially non-zero, in the direction of children endorsing MIND items more strongly than BODY items (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.x), and this difference was exaggerated in assessments of the robot (see the “Target character” row for the “BODY-MIND” comparison in Table 4.x).
HEART vs. MIND
As in analyses using adults’ scales, using children’s own HEART and MIND scales to analyze their data revealed that difference scores between these conceptual units substantially non-zero, in the direction of children endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.x), and this difference was exaggerated in assessments of the robot (see the “Target character” row for the “HEART-MIND” comparison in Table 4.x).
Interim discussion
Using children’s own BODY, HEART, and MIND scales to assess asymmetries in their endorsements of these conceptual units revealed the same pattern of results obtained when using adults’ scales: Children generally showed similar patterns of asymmetries to adults, with the notable exception of the BODY vs. HEART comparision, in which children’s responses revealed no consistent asymmetry. In other words, children, like adults, tended to endorse MIND more strongly than BODY or HEART, but did not show a robust adult-like tendency to endorse BODY more strongly than HEART—regardless of whether these conceptual units were indexed by scales designed to capture adults’ or children’s construals of BODY, HEART, and MIND.

Discussion
XX INSERT STUDY 2 DISCUSSION
Table 4.x: Regression analyses of difference scores among US adults and children (7-9y of age) in Study 2. XX ADD INFO RE CHILDREN. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included two fixed effect parameters: (1) the intercept, which I treat as an index of the asymmetry in attributions of the two conceptual units in question; and (2) a difference between target characters, reported here as a difference between the robot and the grand mean (GM). The intercepts are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
|
Adults |
Children, 7-9y (using adults' scales) |
Children, 7-9y (using their own scales) |
| Parameter |
b |
95% CI |
|
b |
95% CI |
|
b |
95% CI |
|
| BODY - HEART |
| Intercept |
0.29 |
[ 0.26, 0.33] |
* |
0.04 |
[ 0.00, 0.09] |
|
-0.03 |
[-0.08, 0.01] |
|
| Robot vs. GM |
-0.25 |
[-0.28, -0.22] |
* |
-0.20 |
[-0.24, -0.16] |
* |
-0.21 |
[-0.25, -0.16] |
* |
| BODY - MIND |
| Intercept |
-0.34 |
[-0.38, -0.31] |
* |
-0.16 |
[-0.20, -0.13] |
* |
-0.17 |
[-0.21, -0.13] |
* |
| Robot vs. GM |
-0.37 |
[-0.41, -0.34] |
* |
-0.29 |
[-0.32, -0.25] |
* |
-0.30 |
[-0.34, -0.26] |
* |
| HEART - MIND |
| Intercept |
-0.64 |
[-0.68, -0.60] |
* |
-0.21 |
[-0.26, -0.16] |
* |
-0.14 |
[-0.19, -0.08] |
* |
| Robot vs. GM |
-0.13 |
[-0.16, -0.09] |
* |
-0.08 |
[-0.13, -0.03] |
* |
-0.09 |
[-0.15, -0.04] |
* |
Table 4.x: Regression analyses of differences in difference scores between US adults and children (7-9y of age) difference scores in Study 2. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included four fixed effect parameters: (1) the intercept (for adults), which I treat as an index of the asymmetry in attributions of the two conceptual units in question among adults; (2) a difference between target characters (among adults), reported here as a difference between the robot and the grand mean (GM); (3) the overall difference between children and adults (collapsing across target characters); and (4) the interaction between this age difference and the difference between target characters. The developmental comparisons are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
|
Developmental comparison |
| Parameter |
b |
95% CI |
|
| BODY - HEART |
| Intercept |
0.29 |
[ 0.26, 0.33] |
* |
| Children vs. adults |
-0.25 |
[-0.30, -0.20] |
* |
| Robot vs. GM |
-0.25 |
[-0.29, -0.21] |
* |
| Interaction |
0.05 |
[-0.01, 0.10] |
|
| BODY - MIND |
| Intercept |
-0.34 |
[-0.37, -0.31] |
* |
| Children vs. adults |
0.18 |
[ 0.13, 0.23] |
* |
| Robot vs. GM |
-0.37 |
[-0.41, -0.34] |
* |
| Interaction |
0.09 |
[ 0.04, 0.13] |
* |
| HEART - MIND |
| Intercept |
-0.64 |
[-0.68, -0.59] |
* |
| Children vs. adults |
0.43 |
[ 0.37, 0.49] |
* |
| Robot vs. GM |
-0.13 |
[-0.17, -0.08] |
* |
| Interaction |
0.04 |
[-0.02, 0.10] |
|
Study 3: Conceptual change over early and middle childhood (4-9y)
XX INSERT STUDY 3 INTRODUCTION
In Study 3, 116 US adults, 125 “older” children (7.08-9.98 years; median: 8.56y), and 124 “younger” children (4-6.98 years; median: 5.03y) each assessed a single target character on 20 mental capacities. To make the study appropriate for children in this age range, participants assessed a subset of the 40 mental capacities employed in Study 2, chosen to represent the three “conceptual units” revealed by Studies 1-2 (BODY, HEART, and MIND) and to cover a similar range of mental capacities as Studies 1-2. As in Study 2, participants responded on a 3-point scale (“no,” coded as 0; “kinda,” coded as 0.5, “yes,” coded as 1). This study employed the “diverse characters” variant of the general approach, with participants randomly or pseudo-randomly assigned to assess either one of the following 9 characters: an elephant, a goat, a mouse, a bird, a beetle, a teddy bear, a doll, a robot, or a computer. (See Chapter II for detailed methods.)
Special notes on data processing and analysis
Results
Adults
Scale construction
Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 6 items each; see Table 4.x.
Visualization
Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.x, row A.
BODY vs. HEART
First I will consider the relationship between BODY and HEART (Figure 4.x, panel A1). Echoing the visualizations of adults’ responses in Studies 1 and 2, two striking features of this visualization are that (1) there is a positive relationship between scores on the BODY and HEART scales; and (2) there are virtually no datapoints above the line of equivalence (\(y = x\), dotted diagonal line), and certainly no datapoints in upper left quadrant. Individual participants tended to endorse the mental capacity items included in the BODY scale at least as strongly, and often more strongly, than they endorsed items included in the HEART scale—in other words, many participants attributed more BODY than HEART to the target character in question, but virtually no participants attributed more HEART than BODY.
An analysis of mean scores by target character further reveals a suite of characters—namely, inanimate objects—that, in the aggregate, received very low BODY scores and very low HEART scores. This suite of characters appears to be distinct from the other characters—all animate beings—all of which, in the aggregate, received relatively high BODY scores, but varied in their mean HEART scores. Echoing Study 1d, this raises the intriguing possibility that adults’ attributions of BODY and HEART may have been govered by some sort of “threshold” model, in which attributions of any substantial amount of HEART depend on the target character having a certain degree of BODY. (This will not be explored further in the current dissertation.)
BODY vs. MIND
Next I will consider the relationship between BODY and MIND (Figure 4.x, panel A2). As in visualiations of adults’ responses in Studies 1 and 2, two notable features of this visualization are that (1) there is a positive relationship between scores on the BODY and MIND scales; and (2) there are fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it, and no datapoints in lower right quadrant. Echoing Study 1d, however, while participants who assessed certain target characters (namely, the two technologies: a robot and a computer) tended to endorse the mental capacity items included in the MIND scale roughly as strongly, and often more strongly, than they endorsed items included in the BODY scale, participants who asssessed other target characters, if anything, appear to have shown the reverse pattern, endorsing MIND items slightly less strongly than BODY items. In other words, in this “diverse characters” approach shared by Studies 1d and the current study, there appears to be a less consistency in the “asymmetry” betwen BODY and MIND in than there was using the “edge cases” approach of Studies 1a-1c and Study 2.
HEART vs. MIND
Finally I will consider the relationship between HEART and MIND (Figure 4.x, panel A1). As in Study 1, the most striking features of this visualization are that (1) there is a positive relationship between scores on the HEART and MIND scales; and (2) there are virtually no datapoints below the line of equivalence (\(y = x\), dotted diagonal line), and certainly no datapoints in lower right quadrant. Individual participants tended to endorse the mental capacity items included in the MIND scale at least as strongly, and often more strongly, than they endorsed items included in the HEART scale—in other words, many participants attributed more MIND than HEART to the target character in question, but virtually no participants attributed more HEART than MIND.
An analysis of mean scores by target character further reveals that, in the aggregate, characters that received low MIND scores (the two inert toys: a teddy bear and a doll) also received low mean HEART scores, while characters that received relatively high MIND scores (e.g., the robot and all of the aimate beings) varied in their mean HEART scores. Again, this echoes the intriguing possibility, raised by Study 1d, that attributions of HEART and MIND may have been govered by some sort of “threshold” model, in which attributions of any substantial amount of HEART depend on the target character having a certain degree of MIND. (Again, this will not be explored further in the current dissertation.)
Interim discussion
My informal observations of the relationships among adults’ endorsements of the the conceptual units in Study 3 are very similar to those for adults in Studies 1 and 2 (particularly Study 1d, which also employed the “diverse characters” approach taken here): (1) All of these inter-unit relationships were positive, such that the more strongly a participant endorsed one conceptual unit, the more strongly they tended to endorse the others; and (2) There were robust asymmetries in these positive relationships, such that participants tended to endorse either BODY or MIND more strongly than HEART. As in Study 1d, the relationship between BODY vs. MIND appears to be more variable across participants and across target characters than the generally asymmetrical relationship (with participants tending to attribute more MIND than BODY) that emerged in studies that used the “edge case” approach (Studies 1a-1c and Study 2).
Analysis of asymmetries
Here I provide a formal analysis of the asymmetries revealed by the visualizations in the previous section. For each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND), I used Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the nine “diverse characters” that were featured as target characters in these studies. See Figure 4.x, panel A, for visual depictions of these difference scores.
BODY vs. HEART
As in Studies 1 and 2, difference scores comparing scores on the BODY and HEART scales were substantially non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.x). This asymmetry was driven by responses to the animate beings (and was substantially more pronounced for goat, mouse, beetle); among inanimate beings, difference scores hovered around zero (and were substantially less pronounced for teddy bear, doll, robot; see the “Target character” row for the “BODY-HEART” comparison in Table 4.x.
BODY vs. MIND
As in Studies 1 and 2, on the whole, difference scores comparing scores on the BODY and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than BODY items (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.x). However, this asymmetry was driven by responses to the two technologies (particularly the robot). It was much less pronounced—and in some cases ran in the opposite direction—for other characters (particularly elephant, goat, mouse, beetle); see the “Target character” row for the “BODY-MIND” comparison in Table 4.x.
HEART vs. MIND
As in Studies 1 and 2, among adults in Study 2, difference scores comparing scores on the HEART and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.x). Again, this asymmetry was more pronounced for some characters (mouse, beetle, robot), and less pronounced for others (namely, the two inert toys: teddy bear, doll; see the “Target character” row for the “HEART-MIND” comparison in Table 4.x).
Interim discussion
These formal analyses of difference scores across the BODY, HEART, and MIND scales among adults in Study 3 confirm my information observations of asymmetries described in the previous section, echoing the analyses of adults in Studies 1 and 2: Across all of these studies, participants tended to endorse both BODY and MIND more strongly than HEART, while the asymmetry between MIND and BODY was contingent on the type of target character under consideration.
Children (7-9y)
XX INSERT SECTION INTRODUCTION/TRANSITION
Visualization
Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.x, row B.
BODY vs. HEART
First I will consider the relationship between BODY and HEART (Figure 4.x, panel B1). As among adults in this study (panel A1), the relationship between scores on the BODY and HEART scales appears to be somewhat positive, and there appear to be somewhat fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it—but both of these observations are much less striking among children than they were among adults. In other words, while many children attributed more BODY than HEART to the target character in question (like the vast majority of adults), quite a few children attributed more HEART than BODY. Furthermore, a visual inspection of this plot suggests that the asymmetry may have even gone in opposite directions for a target character of particular interest—the robot—with children tending to attribute more BODY than HEART to this unusual social partner.
Echoing the visualizations of adults’ responses, there do appear to be two suites of characters in this visualization: inanimate objects (characterized by generally low BODY scores) and animate beings (characterized by generally high BODY scores). However, while among adults only animate beings varied in their mean HEART scores, among children there appears to be substantial variability in HEART scores in both of these groups of characters. In other words, this visualization does not provide evidence of the kind of “threshold” model discussed for adults.
BODY vs. MIND
Next I will consider the relationship between BODY and MIND (Figure 4.x, panel B2). Among adults, the relationships between scores on the BODY and MIND scales was clearly positive, and there were notably fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it—but neither of these observations is particularly striking among children in this sample. In other words, while some children attributed more BODY than HEART to the target character in question (particularly if they were evaluating one of the two technologies), others attributed more HEART than BODY (particularly if they were evaluating one of animate beings). This echoes the differences across characters in the strength and direction of asymmetries between BODY and MIND observed among adults in this study; indeed, such between-character differences apppear to be even more pronounced among children.
HEART vs. MIND
Finally I will consider the relationship between HEART and MIND (Figure 4.x, panel B3). As among adults in this study (panel A3), the relationship between scores on the HEART and MIND scales appears to be somewhat positive, and there appear to be somewhat fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it—but again both of these observations are much less striking among children than they were among adults. In other words, while many children attributed more MIND than HEART to the target character in question (like the vast majority of adults), quite a few children attributed more HEART than MIND. An analysis of mean scores by target character reveals no evidence of the kind of “threshold” model discussed for adults.
Interim discussion
As in the comparison of adults and children in Study 2, my informal observations of the relationships among older children’s endorsements of the the conceptual units in Study 3 are broadly similar to those of adults in this study, but dramatically attenuated: (1) These inter-unit relationships were what positive, but only somewhat; and (2) There was some evidence of asymmetries in these positive relationships, but these asymmetries were generally weaker and appeared to be highly dependent on which target character participants assessed (particularly for the BODY vs. HEART and BODY vs. MIND comparisons).
Analysis of asymmetries
Here I provide a formal analysis of the asymmetries revealed by the visualizations in the previous section. For each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND), I used Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the nine “diverse characters” that were featured as target characters in these studies. See Figure 4.x, panel B, for visual depictions of these difference scores.
BODY vs. HEART
As among adults, difference scores comparing scores on the BODY and HEART scales were substantially non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.x). Like adults, older children’s asymmetry was driven by responses to the animate beings (and was substantially more pronounced for goat, mouse, bird, beetle); among inanimate beings, difference scores hovered around (or below) zero (and were substantially less pronounced for teddy bear, doll, robot; see the “Target character” row for the “BODY-HEART” comparison in Table 4.x.
BODY vs. MIND
Difference scores comparing scores on the BODY and MIND scales were not substantially different from zero, in contrast to analyses of adults (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.x). This appears to be due to the fact that the asymmetry went in different directions for different characters: Older children tended to attributed more MIND than BODY t the two technologies (robot, computer), but tended to attributed more BODY than MIND to the animate beings (particularly elephant, goat, mouse, bird); see the “Target character” row for the “BODY-MIND” comparison in Table 4.x.
HEART vs. MIND
As among adults, difference scores comparing scores on the HEART and MIND scales were substantially non-zero, in the direction of children endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.x). This asymmetry appeared to hold true across the range of target characters included in this study, and less pronounced for others; see the “Target character” row for the “HEART-MIND” comparison in Table 4.x.
Interim discussion
These formal analyses of difference scores across the BODY, HEART, and MIND scales among older children (7-9y) in Study 3 confirm my informal observations in the previous section: Older children tended to endorse both BODY and MIND more strongly than HEART, while the asymmetry between MIND and BODY was highly contingent on the type of target character under consideration.
Children (4-6y)
XX INSERT SECTION INTRODUCTION/TRANSITION
Visualization
Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.x, row C.
In contrast to the visualizations of these relationships among adults and older children (7-9y of age), among younger children the relationships between BODY, HEART, and MIND (as indexed by adults’ scales) all looked rather similar. In particular, for each pair of conceptual units, there appeared to be a somewhat positive relationship between scores on the two scales; this aligns with my informal observations of adults and older children. In each case (particularly in the BODY vs. HEART and BODY vs. MIND comparisons), two suites of characters emerged: A group of inanimate objects (which, in the aggregate, received moderately low scores on all scales), and a group of animate beings (which, in the aggregate, received moderately high scores on all scales).
An informal inspection of these visualizations suggests only moderate asymmetries in younger children’s attributions of BODY, HEART, and MIND capacities. In the case of BODY vs. HEART, younger children tended to attribute more BODY than HEART (panel C1), but this tendency was quite weak. In the case of BODY vs. MIND (panel C2), younger children’s tended (again, weakly) to attribute more BODY than MIND—the opposite direction of adults and older children. In the case of HEART vs. MIND, this visualiation (panel C3) suggests no systematic asymmetry in younger children’s attributions.
Analysis of asymmetries
Here I provide a formal analysis of the asymmetries (or lack thereof) revealed by the visualizations in the previous section. For each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND), I used Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the nine “diverse characters” that were featured as target characters in these studies. See Figure 4.x, panel C, for visual depictions of these difference scores.
BODY vs. HEART
As among adults and older children, difference scores comparing scores on the BODY and HEART scales were substantially non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.x). As with adults and older children, this asymmetry appears to have been driven by responses to the animate beings, while difference scores for inanimate beings hovered around (or below) zero; see the “Target character” row for the “BODY-HEART” comparison in Table 4.x.
BODY vs. MIND
Difference scores comparing scores on the BODY and HEART scales were substantially non-zero—but in contrasts to older children and adults, among younger children this asymmetry ran in the direction of participants attributing more BODY than MIND (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.x). This asymmetry appears to have been driven by responses to animate beings (and was particularly pronounced for particularly goat, mouse); see the “Target character” row for the “BODY-MIND” comparison in Table 4.x.
HEART vs. MIND
In contrast to adults and older children, among younger children difference scores comparing scores on the HEART and MIND scales did not differ substantially from zero, and varied only subtly across target characters; see the “Target character” row for the “HEART-MIND” comparison in Table 4.x.
Interim discussion
These formal analyses of difference scores across the BODY, HEART, and MIND scales among younger children (4-6y) in Study 3 confirm my informal observations in the previous section. Like older children and adults, younger children tended to endorse BODY more strongly than HEART. However, younger children diverged from their older counterparts by systematically endorsing BODY more strongly than MIND, and by failing to show any systematic asymmetry between HEART and MIND.
Developmental comparison
In the previous sections, I analyzed adults’, older children’s, and younger children’s responses separately. Here I conduct a formal comparison of difference scores between conceptual units among these three age groups, to assess the size and robustness of these ostensive developmental differences.
BODY vs. HEART
Difference scores between the BODY and HEART scales were substantially closer to zero among both older and younger children, as compared to adults (see the “Older vs. adults” and “Younger children vs. adults” rows for the “BODY-HEART” comparison in Table 4.x). A handful of the differences between target characters differed substantially across age groups (see the “Interaction” row for the “BODY-HEART” comparison in Table 4.x); this is outside of the scope of the current chapter.
BODY vs. MIND
Difference scores between the BODY and MIND scales were not differentiable from adults among older children in this analysis, but reversed in sign among younger children (see the “Older vs. adults” and “Younger children vs. adults” rows for the “BODY-MIND” comparison in Table 4.x). Again, handful of the differences between target characters differed substantially across age groups (see the “Interaction” row for the “BODY-MIND” comparison in Table 4.x); this is outside of the scope of the current chapter.
HEART vs. MIND
Difference scores between the HEART and MIND scales were substantially closer to zero among both older children and younger children, as compared to adults (see the “Older children vs. adults” and “Younger children vs. adults” rows for the “HEART-MIND” comparison in Table 4.x), Again, handful of the differences between target characters differed substantially across age groups (see the “Interaction” row for the “HEART-MIND” comparison in Table 4.x); this is outside of the scope of the current chapter.
Interim discussion
These formal comparisons of difference scores among younger children (4-6y), older children (7-9y), and adults in Study 3 confirm my earlier observations that asymmetries were substantially attenuated among both older and especially younger children, relative to the baseline set by adults. The only exceptions to this rule were (1) The BODY vs. MIND difference scores among older children was not differentiable from those of adults (likely because this was the weakest of the asymmetries among adults); and (2) The BODY vs. MIND difference scores among younger children ran in the opposite direction to those of adults (as discussed in my earlier description of younger children’s responses).
Discussion
XX INSERT STUDY 3 DISCUSSION


Table 4.x: Regression analyses of difference scores among US adults, older children (7-9y of age), and younger children (4-6y of age) in Study 3. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included two fixed effect parameters: (1) the intercept, which I treat as an index of the asymmetry in attributions of the two conceptual units in question; and (2) a difference between target characters, reported here as a difference between the robot and the grand mean (GM). The intercepts are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
|
Adults |
Children, 7-9y (using adults' scales) |
Children, 4-6y (using adults' scales) |
| Parameter |
b |
95% CI |
|
b |
95% CI |
|
b |
95% CI |
|
| BODY - HEART |
| Intercept |
0.29 |
[ 0.24, 0.33] |
* |
0.07 |
[ 0.03, 0.11] |
* |
0.14 |
[ 0.09, 0.18] |
* |
| Elephant vs. GM |
0.03 |
[-0.08, 0.13] |
|
0.04 |
[-0.07, 0.16] |
|
0.08 |
[-0.04, 0.20] |
|
| Goat vs. GM |
0.24 |
[ 0.14, 0.34] |
* |
0.10 |
[-0.02, 0.21] |
|
0.19 |
[ 0.06, 0.31] |
* |
| Mouse vs. GM |
0.45 |
[ 0.32, 0.59] |
* |
0.09 |
[-0.02, 0.20] |
|
0.17 |
[ 0.05, 0.30] |
* |
| Bird vs. GM |
0.06 |
[-0.05, 0.18] |
|
0.18 |
[ 0.06, 0.30] |
* |
0.19 |
[ 0.07, 0.31] |
* |
| Beetle vs. GM |
0.36 |
[ 0.23, 0.48] |
* |
0.02 |
[-0.10, 0.13] |
|
0.21 |
[ 0.10, 0.33] |
* |
| Teddy bear vs. GM |
-0.33 |
[-0.49, -0.16] |
* |
-0.04 |
[-0.14, 0.07] |
|
-0.25 |
[-0.40, -0.11] |
* |
| Doll vs. GM |
-0.30 |
[-0.40, -0.19] |
* |
-0.14 |
[-0.26, -0.03] |
* |
-0.14 |
[-0.27, -0.01] |
* |
| Robot vs. GM |
-0.27 |
[-0.37, -0.16] |
* |
-0.18 |
[-0.30, -0.06] |
* |
-0.37 |
[-0.50, -0.25] |
* |
| BODY - MIND |
| Intercept |
-0.06 |
[-0.10, -0.03] |
* |
0.11 |
[ 0.06, 0.15] |
* |
-0.01 |
[-0.05, 0.03] |
|
| Elephant vs. GM |
0.12 |
[ 0.04, 0.21] |
* |
0.12 |
[-0.02, 0.26] |
|
0.19 |
[ 0.08, 0.29] |
* |
| Goat vs. GM |
0.20 |
[ 0.12, 0.28] |
* |
0.17 |
[ 0.03, 0.31] |
* |
0.25 |
[ 0.13, 0.37] |
* |
| Mouse vs. GM |
0.14 |
[ 0.03, 0.25] |
* |
0.26 |
[ 0.13, 0.40] |
* |
0.21 |
[ 0.09, 0.32] |
* |
| Bird vs. GM |
0.06 |
[-0.03, 0.15] |
|
0.07 |
[-0.08, 0.22] |
|
0.25 |
[ 0.13, 0.37] |
* |
| Beetle vs. GM |
0.15 |
[ 0.06, 0.25] |
* |
-0.01 |
[-0.16, 0.13] |
|
0.10 |
[-0.01, 0.21] |
|
| Teddy bear vs. GM |
0.12 |
[-0.02, 0.25] |
|
-0.14 |
[-0.27, -0.01] |
* |
0.08 |
[-0.06, 0.22] |
|
| Doll vs. GM |
0.05 |
[-0.03, 0.14] |
|
-0.14 |
[-0.28, 0.00] |
|
-0.07 |
[-0.20, 0.05] |
|
| Robot vs. GM |
-0.56 |
[-0.64, -0.48] |
* |
-0.09 |
[-0.23, 0.06] |
|
-0.52 |
[-0.64, -0.40] |
* |
| HEART - MIND |
| Intercept |
-0.35 |
[-0.40, -0.30] |
* |
0.03 |
[-0.02, 0.08] |
|
-0.14 |
[-0.21, -0.08] |
* |
| Elephant vs. GM |
0.10 |
[-0.02, 0.22] |
|
0.08 |
[-0.07, 0.21] |
|
0.11 |
[-0.05, 0.26] |
|
| Goat vs. GM |
-0.04 |
[-0.16, 0.07] |
|
0.07 |
[-0.06, 0.21] |
|
0.06 |
[-0.11, 0.24] |
|
| Mouse vs. GM |
-0.32 |
[-0.48, -0.16] |
* |
0.17 |
[ 0.04, 0.31] |
* |
0.04 |
[-0.13, 0.21] |
|
| Bird vs. GM |
0.00 |
[-0.13, 0.14] |
|
-0.12 |
[-0.27, 0.04] |
|
0.06 |
[-0.11, 0.23] |
|
| Beetle vs. GM |
-0.20 |
[-0.36, -0.05] |
* |
-0.03 |
[-0.17, 0.11] |
|
-0.12 |
[-0.28, 0.04] |
|
| Teddy bear vs. GM |
0.44 |
[ 0.24, 0.65] |
* |
-0.10 |
[-0.23, 0.02] |
|
0.33 |
[ 0.14, 0.53] |
* |
| Doll vs. GM |
0.35 |
[ 0.22, 0.48] |
* |
0.00 |
[-0.14, 0.15] |
|
0.07 |
[-0.11, 0.24] |
|
| Robot vs. GM |
-0.29 |
[-0.41, -0.17] |
* |
0.09 |
[-0.06, 0.24] |
|
-0.14 |
[-0.30, 0.03] |
|
Table 4.x: Regression analyses of differences in difference scores between US adults and both older children (7-9y of age) and younger children (4-6y of age) in Study 3. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included four fixed effect parameters: (1) the intercept (for adults), which I treat as an index of the asymmetry in attributions of the two conceptual units in question among adults; (2) a difference between target characters (among adults), reported here as a difference between the robot and the grand mean (GM); (3) the overall difference between children and adults (collapsing across target characters); and (4) the interaction between this age difference and the difference between target characters. The developmental comparisons of the intercepts are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
|
Developmental comparison |
| Parameter |
b |
95% CI |
|
| BODY - HEART |
| Intercept |
0.29 |
[ 0.24, 0.33] |
* |
| Older children vs. adults |
-0.15 |
[-0.21, -0.09] |
* |
| Younger children vs. adults |
-0.21 |
[-0.28, -0.15] |
* |
| Elephant vs. GM |
0.03 |
[-0.09, 0.14] |
|
| Goat vs. GM |
0.24 |
[ 0.13, 0.35] |
* |
| Mouse vs. GM |
0.46 |
[ 0.31, 0.61] |
* |
| Bird vs. GM |
0.06 |
[-0.06, 0.18] |
|
| Beetle vs. GM |
0.36 |
[ 0.23, 0.49] |
* |
| Teddy bear vs. GM |
-0.33 |
[-0.50, -0.16] |
* |
| Doll vs. GM |
-0.30 |
[-0.41, -0.18] |
* |
| Robot vs. GM |
-0.27 |
[-0.37, -0.16] |
* |
| Older children vs. adults * Elephant vs. GM |
0.05 |
[-0.10, 0.21] |
|
| Older children vs. adults * Goat vs. GM |
-0.06 |
[-0.22, 0.09] |
|
| Older children vs. adults * Mouse vs. GM |
-0.29 |
[-0.47, -0.10] |
* |
| Older children vs. adults * Bird vs. GM |
0.13 |
[-0.03, 0.30] |
|
| Older children vs. adults * Beetle vs. GM |
-0.14 |
[-0.31, 0.03] |
|
| Older children vs. adults * Teddy bear vs. GM |
0.07 |
[-0.15, 0.29] |
|
| Older children vs. adults * Doll vs. GM |
0.15 |
[-0.02, 0.33] |
|
| Older children vs. adults * Robot vs. GM |
-0.11 |
[-0.27, 0.05] |
|
| Younger children vs. adults * Elephant vs. GM |
0.02 |
[-0.15, 0.18] |
|
| Younger children vs. adults * Goat vs. GM |
-0.14 |
[-0.30, 0.02] |
|
| Younger children vs. adults * Mouse vs. GM |
-0.36 |
[-0.56, -0.18] |
* |
| Younger children vs. adults * Bird vs. GM |
0.12 |
[-0.04, 0.30] |
|
| Younger children vs. adults * Beetle vs. GM |
-0.34 |
[-0.52, -0.17] |
* |
| Younger children vs. adults * Teddy bear vs. GM |
0.29 |
[ 0.09, 0.49] |
* |
| Younger children vs. adults * Doll vs. GM |
0.15 |
[-0.02, 0.32] |
|
| Younger children vs. adults * Robot vs. GM |
0.09 |
[-0.07, 0.25] |
|
| BODY - MIND |
| Intercept |
-0.06 |
[-0.11, -0.02] |
* |
| Older children vs. adults |
0.05 |
[-0.01, 0.12] |
|
| Younger children vs. adults |
0.17 |
[ 0.11, 0.23] |
* |
| Elephant vs. GM |
0.12 |
[ 0.00, 0.24] |
* |
| Goat vs. GM |
0.20 |
[ 0.09, 0.30] |
* |
| Mouse vs. GM |
0.14 |
[ 0.00, 0.28] |
* |
| Bird vs. GM |
0.06 |
[-0.05, 0.18] |
|
| Beetle vs. GM |
0.15 |
[ 0.02, 0.29] |
* |
| Teddy bear vs. GM |
0.12 |
[-0.05, 0.29] |
|
| Doll vs. GM |
0.05 |
[-0.06, 0.16] |
|
| Robot vs. GM |
-0.56 |
[-0.66, -0.45] |
* |
| Older children vs. adults * Elephant vs. GM |
0.07 |
[-0.09, 0.23] |
|
| Older children vs. adults * Goat vs. GM |
0.06 |
[-0.11, 0.22] |
|
| Older children vs. adults * Mouse vs. GM |
0.07 |
[-0.11, 0.25] |
|
| Older children vs. adults * Bird vs. GM |
0.19 |
[ 0.03, 0.36] |
* |
| Older children vs. adults * Beetle vs. GM |
-0.05 |
[-0.23, 0.12] |
|
| Older children vs. adults * Teddy bear vs. GM |
-0.04 |
[-0.26, 0.17] |
|
| Older children vs. adults * Doll vs. GM |
-0.13 |
[-0.29, 0.04] |
|
| Older children vs. adults * Robot vs. GM |
0.04 |
[-0.12, 0.20] |
|
| Younger children vs. adults * Elephant vs. GM |
0.00 |
[-0.17, 0.17] |
|
| Younger children vs. adults * Goat vs. GM |
-0.02 |
[-0.18, 0.13] |
|
| Younger children vs. adults * Mouse vs. GM |
0.13 |
[-0.06, 0.31] |
|
| Younger children vs. adults * Bird vs. GM |
0.00 |
[-0.17, 0.18] |
|
| Younger children vs. adults * Beetle vs. GM |
-0.16 |
[-0.34, 0.02] |
|
| Younger children vs. adults * Teddy bear vs. GM |
-0.26 |
[-0.47, -0.06] |
* |
| Younger children vs. adults * Doll vs. GM |
-0.19 |
[-0.35, -0.02] |
* |
| Younger children vs. adults * Robot vs. GM |
0.47 |
[ 0.30, 0.64] |
* |
| HEART - MIND |
| Intercept |
-0.35 |
[-0.40, -0.29] |
* |
| Older children vs. adults |
0.20 |
[ 0.13, 0.28] |
* |
| Younger children vs. adults |
0.38 |
[ 0.31, 0.46] |
* |
| Elephant vs. GM |
0.10 |
[-0.05, 0.23] |
|
| Goat vs. GM |
-0.05 |
[-0.18, 0.08] |
|
| Mouse vs. GM |
-0.32 |
[-0.50, -0.14] |
* |
| Bird vs. GM |
0.00 |
[-0.15, 0.14] |
|
| Beetle vs. GM |
-0.21 |
[-0.37, -0.04] |
* |
| Teddy bear vs. GM |
0.45 |
[ 0.23, 0.66] |
* |
| Doll vs. GM |
0.35 |
[ 0.21, 0.49] |
* |
| Robot vs. GM |
-0.29 |
[-0.42, -0.16] |
* |
| Older children vs. adults * Elephant vs. GM |
0.01 |
[-0.19, 0.21] |
|
| Older children vs. adults * Goat vs. GM |
0.11 |
[-0.09, 0.31] |
|
| Older children vs. adults * Mouse vs. GM |
0.36 |
[ 0.14, 0.59] |
* |
| Older children vs. adults * Bird vs. GM |
0.06 |
[-0.14, 0.26] |
|
| Older children vs. adults * Beetle vs. GM |
0.09 |
[-0.12, 0.31] |
|
| Older children vs. adults * Teddy bear vs. GM |
-0.12 |
[-0.40, 0.15] |
|
| Older children vs. adults * Doll vs. GM |
-0.28 |
[-0.49, -0.08] |
* |
| Older children vs. adults * Robot vs. GM |
0.15 |
[-0.06, 0.35] |
|
| Younger children vs. adults * Elephant vs. GM |
-0.02 |
[-0.22, 0.19] |
|
| Younger children vs. adults * Goat vs. GM |
0.12 |
[-0.08, 0.31] |
|
| Younger children vs. adults * Mouse vs. GM |
0.49 |
[ 0.27, 0.72] |
* |
| Younger children vs. adults * Bird vs. GM |
-0.12 |
[-0.33, 0.09] |
|
| Younger children vs. adults * Beetle vs. GM |
0.18 |
[-0.05, 0.41] |
|
| Younger children vs. adults * Teddy bear vs. GM |
-0.55 |
[-0.81, -0.30] |
* |
| Younger children vs. adults * Doll vs. GM |
-0.34 |
[-0.55, -0.12] |
* |
| Younger children vs. adults * Robot vs. GM |
0.38 |
[ 0.18, 0.59] |
* |
Study 4: A focus on early childhood (4-5y)
XX INSERT STUDY INTRODUCTION
In Study 4, 104 US adults and 43 US children between the ages of 4.02-5.59 years (median: 4.73y) each assessed two target characters on 18 mental capacities. To make the study appropriate for children in this age range, this study employed a new set of 18 mental capacities (some but not all of which were used in Studies 1-3). In addition, participants were presented with a more child-friendly visual representation of the 3-point response scale (“no,” coded as 0; “kinda,” coded as 0.5, “yes,” coded as 1). This study employed the “edge case” variant of the general approach, with participants assessing both a beetle or a robot in sequence (with order counterbalanced across participants). (See Chapter II for detailed methods.)
Special notes on data processing and analysis
Results
Adults
Scale construction
Following the steps described in “General analysis plan,” above, yielded BODY, HEART, and MIND scales of 5 items each; see Table 4.x.
Visualization
Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.x, row A.
These visualizations are all extremely similar to those discussed at length in Studies 1a-1c and Study 2; I will not describe them further here.
Analysis of asymmetries
Here I provide a formal analysis of these asymmetries. As in previous studies, for each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND), I used Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the two “edge cases” that were featured as target characters in these studies. As in Study 1d, I account for the within-subjects design by included maximal random effects structure (in this case, random intercepts for participants). See Figure 4.x, panel D, for visual depictions of these difference scores.
BODY vs. HEART
As in previous studies, difference scores comparing adults’ scores on the BODY and HEART scales were substantially non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.x). Again, this difference was driven by participants’ assessments of the beetle; in the aggregate, difference scores were reduced to 0 for the robot (see the “Target character” row for the “BODY-HEART” comparison in Table 4.x).
BODY vs. MIND
As previous studies, difference scores comparing adults’ scores on the BODY and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than BODY items (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.x). Again, this difference was driven by participants’ assessments of the robot; in the aggregate, difference scores tended to be greater, not less, than zero for the beetle (see the “Target character” row for the “BODY-MIND” comparison in Table 4.x).
HEART vs. MIND
As in previous studies, difference scores comparing adults’ scores on the HEART and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.x). Again, this difference was somewhat exaggerated in assessments of the robot, relative to the beetle (see the “Target character” row for the “HEART-MIND” comparison in Table 4.x).
Interim discussion
These formal analyses of difference scores across the BODY, HEART, and MIND scales among adults in Study 4 confirm my information observations of asymmetries described in the previous section, and align quite closely with analyses of adults in Studies 1a-1c and Study 2: Across all of the studies that used the “edge case approach” to inducing variability in mental capacity attributions, adults tended to endorse MIND more strongly than BODY or HEART, and BODY more strongly than HEART.
Children (4-5y)
XX INSERT SECTION INTRODUCTION/TRANSITION
Visualization
Visualizations of relationships among scores on these BODY, HEART, and MIND scales are provided in Figure 4.x, row B.
BODY vs. HEART
First I will consider the relationship between BODY and HEART (Figure 4.x, panel B1). As among adults in this study (panel A1), the relationship between scores on the BODY and HEART scales appears to be somewhat positive, and there appear to be somewhat fewer datapoints above the line of equivalence (\(y = x\), dotted diagonal line) than below it—but both of these observations are much less striking among children than they were among adults. In other words, while, like the vast majority of adults, many children attributed more BODY than HEART to the target character in question (particularly to the beetle, in red), quite a few children attributed more HEART than BODY (particularly to the robot, in blue).
BODY vs. MIND
Next I will consider the relationship between BODY and MIND (Figure 4.x, panel B2). As among adults in this study (panel A2), the relationship between scores on the BODY and MIND scales appears to be somewhat positive, there is no obvious evidence of any asymmetry in children’s attributions of these two conceptual units. In other words, while, like the majority of adults, some children attributed more MIND than BODY to the target character in question (particularly to the robot, in blue), other children attributed more BODY than MIND (particularly to the beetle, in red). This is reminisent of my earlier observation among older children (7-9y) in Study 2, where the relationship between BODY and MIND scores went in opposite directions for these two “edge cases.”
HEART vs. MIND
Finally I will consider the relationship between HEART and MIND (Figure 4.x, panel B3). As among adults in this study (panel A3), the relationship between scores on the HEART and MIND scales appears to be positive, and there appear to be somewhat fewer datapoints below the line of equivalence (\(y = x\), dotted diagonal line) than above it—but, as in the previous sections, both of these observations are much less striking among children than they were among adults. In other words, while many children attributed more MIND than HEART to the target character in question (like the vast majority of adults), quite a few children attributed more HEART than MIND. This appears to have been true for both target characters.
Interim discussion
Using a particularly child-friendly paradigm, the relationships young children’s endorsements of BODY, HEART, and MIND (as defined by adults’ EFA solution) appear to be slightly more resonant with the relationships observed among adults. All of these inter-unit relationships were somewaht positive—but only somewhat. There was some evidence of asymmetries in these positive relationships, but these asymmetries were generally weaker and appeared to be highly dependent on which target character participants assessed (particularly for the BODY vs. HEART and BODY vs. MIND comparisons, as was the case in Study 2 with older children).
Analysis of asymmetries
Here I provide a formal analysis of the asymmetries (or lack thereof) revealed by the visualizations in the previous section. As in previous analyses, for each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND), I used Bayesian regression to compare difference scores between these two conceptual units to zero, controlling for differences in assessments of the two “edge cases” that were featured as target characters in these studies (beetle and robot), and accounting for the within-subjects design of this study by including maximal random effects structures (in this case, random intercepts for participants). See Figure 4.XX, panel B, for visual depictions of these difference scores.
BODY vs. HEART
As among adults, among children difference scores comparing scores on the BODY and HEART scales were significantly non-zero, in the direction of participants endorsing BODY items more strongly than HEART items (see the “Intercept” row for the “BODY-HEART” comparison in Table 4.x). However, this asymmetry was reduced to zero for assessments of the robot (see the “Target character” row for the “BODY-HEART” comparison in Table 4.x).
BODY vs. MIND
In contrast to adults, among children difference scores comparing scores on the BODY and MIND scales were not differentiable from zero (see the “Intercept” row for the “BODY-MIND” comparison in Table 4.x). This appears to be due to the fact that the asymmetry ran in different directions for the two target characters (see the “Target character” row for the “BODY-MIND” comparison in Table 4.x).
HEART vs. MIND
As among adults, among children difference scores comparing scores on the HEART and MIND scales were substantially non-zero, in the direction of participants endorsing MIND items more strongly than HEART items (see the “Intercept” row for the “HEART-MIND” comparison in Table 4.x), and this difference was slightly exaggerated in assessments of the robot(see the “Target character” row for the “HEART-MIND” comparison in Table 4.x).
Interim discussion
These formal analyses of difference scores across the BODY, HEART, and MIND scales among children in Study 4 confirm my informal observations that in this particularly child-friendly paradigm, young children were adult-like in their tendency to endorse BODY and MIND more strongly than HEART, while failing to show the adult-like tendency to endorse MIND more strongly than BODY for these two edge cases. Instead, like children in other studies (XX INSERT REFERENCES), the asymmetry between BODY and MIND appeared to depend on which target was being assessed.

Developmental comparison
In the previous sections, I analyzed adults’ and children’s responses separately. Here I conduct a formal comparison of difference scores between conceptual units among these two age groups, to assess the size and robustness of these ostensive developmental differences.
BODY vs. HEART
Difference scores between the BODY and HEART scales were substantially closer to zero among children, as compared to adults (see the “Children vs. adults” row for the “BODY-HEART” comparison in Table 4.x), and the difference between target characters was attenuated among children (see the “Interaction” row for the “BODY-HEART” comparison in Table 4.x).
BODY vs. MIND
Difference scores between the BODY and MIND scales were substantially closer to zero among children, as compared to adults (see the “Children vs. adults” row for the “BODY-MIND” comparison in Table 4.x), and the difference between target characters was attenuated among children (see the “Interaction” row for the “BODY-MIND” comparison in Table 4.x).
HEART vs. MIND
Difference scores between the HEART and MIND scales were substantially closer to zero among children, as compared to adults (see the “Children vs. adults” row for the “HEART-MIND” comparison in Table 4.x), and the difference between target characters was attenuated among children (see the “Interaction” row for the “HEART-MIND” comparison in Table 4.x).
Interim discussion
These formal comparisons of difference scores among children vs. adults in Study 4 confirm my earlier observations that asymmetries were substantially attenuated (and in some cases, reduced to zero) among children, relative to the baseline set by adults. In addition, among children the differences in these asymmetries between the two “edge cases” included in this study (the beetle vs. the robot) were also attenuated, relative to adults.
Discussion
XX INSERT STUDY 4 DISCUSSION
Table 4.x: Scales for each of the conceptual units (factors) identified by EFA for US Adults in Studies 2-4 and for 7- to 9-year-old childrenin Studies 2 and 3. (See Appendix B for alternative scales based on younger children's EFA results, for Studies 3 and 4.) A checkmark indicates that a mental capacity was included in a scale for a particular sample.
|
Study 2 |
Study 3 |
Study 4 |
| Capacity |
Adults |
Children, 7-9y |
Adults |
Children, 7-9y |
Adults |
| BODY scale |
| get/feel hungry |
✓ |
✓ |
✓ |
✓ |
✓ |
| feel pain |
✓ |
✓ |
✓ |
✓ |
|
| feel/get scared |
✓ |
✓ |
✓ |
✓ |
|
| feel tired |
✓ |
✓ |
✓ |
✓ |
✓ |
| feel safe |
✓ |
|
|
|
|
| smell things |
✓ |
✓ |
✓ |
✓ |
✓ |
| get/feel sick[...] |
|
✓ |
✓ |
|
✓ |
| get thirsty |
|
|
|
|
✓ |
| get angry |
|
|
|
✓ |
|
| HEART scale |
| feel proud |
✓ |
✓ |
✓ |
✓ |
|
| feel joy |
✓ |
✓ |
|
|
|
| feel/get sad |
✓ |
✓ |
✓ |
✓ |
✓ |
| feel happy |
✓ |
✓ |
|
|
|
| feel love/love someone |
✓ |
✓ |
✓ |
✓ |
✓ |
| feel guilty/sorry |
✓ |
|
✓ |
✓ |
✓ |
| get hurt feelings |
|
✓ |
✓ |
✓ |
|
| feel embarrassed |
|
|
✓ |
✓ |
|
| hate someone |
|
|
|
|
✓ |
| get lonely |
|
|
|
|
✓ |
| MIND scale |
| figure out how to do things/figure things out |
✓ |
✓ |
✓ |
✓ |
✓ |
| make choices |
✓ |
|
✓ |
✓ |
|
| recognize somebody else |
✓ |
|
|
|
|
| sense...far away |
✓ |
✓ |
✓ |
✓ |
|
| remember things |
✓ |
✓ |
✓ |
✓ |
✓ |
| see [things] |
✓ |
|
|
|
|
| be aware of itself |
|
✓ |
|
|
|
| be aware of things |
|
✓ |
✓ |
✓ |
|
| sense temperatures |
|
✓ |
✓ |
✓ |
|
| know stuff |
|
|
|
|
✓ |
| have thoughts/think |
|
|
|
|
✓ |
| hear [sounds] |
|
|
|
|
✓ |


Table 4.x: Regression analyses of difference scores among US adults and children (4-5y of age) in Study 4. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included two fixed effect parameters: (1) the intercept, which I treat as an index of the asymmetry in attributions of the two conceptual units in question; and (2) a difference between target characters, reported here as a difference between the robot and the grand mean (GM). The intercepts are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
|
Adults |
Children, 4-6y (using adults' scales) |
| Parameter |
b |
95% CI |
|
b |
95% CI |
|
| BODY - HEART |
| Intercept |
0.27 |
[ 0.24, 0.31] |
* |
0.10 |
[ 0.03, 0.16] |
* |
| Robot vs. GM |
-0.27 |
[-0.31, -0.24] |
* |
-0.17 |
[-0.23, -0.11] |
* |
| BODY - MIND |
| Intercept |
-0.20 |
[-0.24, -0.17] |
* |
-0.01 |
[-0.08, 0.05] |
|
| Robot vs. GM |
-0.37 |
[-0.40, -0.34] |
* |
-0.18 |
[-0.24, -0.12] |
* |
| HEART - MIND |
| Intercept |
-0.48 |
[-0.52, -0.43] |
* |
-0.11 |
[-0.17, -0.04] |
* |
| Robot vs. GM |
-0.10 |
[-0.14, -0.06] |
* |
-0.02 |
[-0.07, 0.04] |
|
Table 4.x: Regression analyses of differences in difference scores between US adults and children (4-5y of age) difference scores in Study 4. The table presents results from separate Bayesian regressions of each pair of conceptual units (BODY vs. HEART, BODY vs. MIND, and HEART vs. MIND). Each regression included four fixed effect parameters: (1) the intercept (for adults), which I treat as an index of the asymmetry in attributions of the two conceptual units in question among adults; (2) a difference between target characters (among adults), reported here as a difference between the robot and the grand mean (GM); (3) the overall difference between children and adults (collapsing across target characters); and (4) the interaction between this age difference and the difference between target characters. The developmental comparisons are highlighted in bold, because these are the primary parameters of interest for these analyses. For each parameter, the table includes the estimate (b) and a 95% credible interval for that estimate. Asterisks indicate 95% credible intervals that do not include 0.
|
Developmental comparison |
| Parameter |
b |
95% CI |
|
| BODY - HEART |
| Intercept |
0.27 |
[ 0.24, 0.31] |
* |
| Children vs. adults |
-0.18 |
[-0.24, -0.11] |
* |
| Robot vs. GM |
-0.27 |
[-0.31, -0.24] |
* |
| Interaction |
0.11 |
[ 0.04, 0.17] |
* |
| BODY - MIND |
| Intercept |
-0.20 |
[-0.24, -0.17] |
* |
| Children vs. adults |
0.19 |
[ 0.13, 0.26] |
* |
| Robot vs. GM |
-0.37 |
[-0.41, -0.34] |
* |
| Interaction |
0.19 |
[ 0.12, 0.25] |
* |
| HEART - MIND |
| Intercept |
-0.48 |
[-0.52, -0.43] |
* |
| Children vs. adults |
0.37 |
[ 0.29, 0.45] |
* |
| Robot vs. GM |
-0.10 |
[-0.13, -0.06] |
* |
| Interaction |
0.08 |
[ 0.01, 0.15] |
* |
General discussion
XX __INSERT GENERAL DISCUSSION_
Chapter conclusion
In this chapter, I explored a second aspect of conceptual representations of mental life among US children and adults: The relationships among conceptual units. Studies 2-4 are consistent with the following theory: XX.
As in Chapter III, I urge the reader to remember that this is not the only possible interpretation of the pattern of results presented here; additional studies—in particular, studies designed to test the hypothesis that XX— could provide converging evidence or could challenge this theoretical interpretation. Instead, the primary role of the re-analysis discussed here has been to inspire the hypothesis stated in the previous paragraph and to the foundation for future tests of this hypothesis, in turn refining a general theory of this aspect of conceptual development.
In the next chapter, I apply the same exploratory spirit to the third and final aspect of conceptual representations of mental life: the application or deployment of these conceptual units in reasoning about various kinds of beings.
LS0tCnRpdGxlOiAiQ2hhcHRlciBJVjogQ2hhbmdlcyBpbiBvcmdhbml6YXRpb24gb2YgY29uY2VwdHVhbCB1bml0cyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICB0b2NfZmxvYXQ6IHllcwphbHdheXNfYWxsb3dfaHRtbDogeWVzCi0tLQoKYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGUgPSBGfQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNjcsCiAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gRiwgZWNobyA9IEYpCmBgYAoKYGBge3J9CiMgIyBmb3Iga25pdHRpbmcgdG8gLmRvY3gKIyBvdXRwdXQ6CiMgICB3b3JkX2RvY3VtZW50OgojICAgICByZWZlcmVuY2VfZG9jeDogIi4vc3RvcmVkL3dvcmQtc3R5bGVzLXJlZmVyZW5jZS5kb2N4IgojIGFsd2F5c19hbGxvd19odG1sOiB5ZXMKCiMgIyBmb3Iga25pdHRpbmcgdG8gLm5iLmh0bWwgCiMgb3V0cHV0OgojICAgaHRtbF9ub3RlYm9vazoKIyAgICAgdG9jOiB5ZXMKIyAgICAgdG9jX2RlcHRoOiA0CiMgICAgIHRvY19mbG9hdDogeWVzCmBgYAoKYGBge3J9CiMgcnVuIHVyLXNldHVwIHNjcmlwdCAod2hpY2ggcnVucyBvdGhlciBzY3JpcHRzKQpzb3VyY2UoIi4vc2NyaXB0cy9fU0VUVVAuUiIpCgojIGxvYWQgaW4gRUZBcyAmIG5hbWVzIGZyb20gQ2hhcHRlciBJSUkKc291cmNlKCIuL3NjcmlwdHMvc3RvcmVkX2NoMDMuUiIpCmBgYAoKCiMgQ2hhcHRlciBvdmVydmlldwoKSW4gdGhpcyBjaGFwdGVyLCBJIGZvY3VzIG9uIHRoZSBzZWNvbmQgb2YgbXkgdGhyZWUga2V5IHF1ZXN0aW9ucyBhYm91dCB0aGUgZGV2ZWxvcG1lbnQgb2YgcmVwcmVzZW50YXRpb25zIG9mIG1lbnRhbCBsaWZlOiBfSG93IGFyZSB0aGUgY29uY2VwdHVhbCB1bml0cyB0aGF0IGFuY2hvciByZXByZXNlbnRhdGlvbnMgb2YgbWVudGFsIGxpZmUgb3JnYW5pemVkIGluIHJlbGF0aW9uIHRvIGVhY2ggb3RoZXIsIGFuZCBob3cgZG9lcyB0aGlzIG9yZ2FuaXphdGlvbiBjaGFuZ2Ugb3ZlciBkZXZlbG9wbWVudD9fIEFzIGluIENoYXB0ZXIgSUlJLCB0byBhZGRyZXNzIHRoaXMgcXVlc3Rpb24gSSBkcmF3IG9uIGRhdGEgZnJvbSBhbGwgb2YgdGhlIGN1cnJlbnQgc3R1ZGllcyAoU3R1ZGllcyAxLTQpOyBmb3IgZGV0YWlscyBhYm91dCB0aGUgbWV0aG9kcyBvZiB0aGVzZSBzdHVkaWVzLCBzZWUgQ2hhcHRlciBJSS4gVGhlIGdvYWwgb2YgdGhpcyBjaGFwdGVyIGlzIHRvIHByb3ZpZGUgInNuYXBzaG90cyIgb2YgdGhlIG9yZ2FuaXphdGlvbiBvZiBjb25jZXB0dWFsIHVuaXRzIGluIGVhcmx5IGNoaWxkaG9vZCwgbWlkZGxlIGNoaWxkaG9vZCwgYW5kIGFkdWx0aG9vZC4KCgojIEdlbmVyYWwgYW5hbHlzaXMgcGxhbgoKIyMgSGlnaC1sZXZlbCBvdmVydmlldwoKTXkgZ29hbCBpbiB0aGlzIGNoYXB0ZXIgaXMgdG8gZXhhbWluZSB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgImNvbmNlcHR1YWwgdW5pdHMiIGlkZW50aWZpZWQgaW4gQ2hhcHRlciBJSUkuIEhvdyBkb2VzIGEgcGFydGljaXBhbnQncyBhc3Nlc3NtZW50IG9mIG9uZSBjb25jZXB0dWFsIHVuaXQgZm9yIGEgcGFydGljdWxhciB0YXJnZXQgY2hhcmFjdGVyIChlLmcuLCB0aGUgZGVncmVlIHRvIHdoaWNoIGhlIG9yIHNoZSBpbmRpY2F0ZXMgdGhhdCBhIGJlZXRsZSBpcyBjYXBhYmxlIG9mIHRoZSBwaHlzaW9sb2dpY2FsIHNlbnNhdGlvbnMgb2YgdGhlIEJPRFkpIGFmZmVjdCB0aGF0IHBhcnRpY2lwYW50J3MgYXNzZXNzbWVudHMgb2Ygb3RoZXIgY29uY2VwdHVhbCB1bml0cyBmb3IgdGhhdCB0YXJnZXQgY2hhcmFjdGVyIChlLmcuLCBoaXMgb3IgaGVyIGFzc2Vzc21lbnQgb2YgdGhlIGJlZXRsZSdzIGNhcGFjaXRlaXMgaW4gdGhlIGRvbWFpbnMgb2YgSEVBUlQgb3IgTUlORCk/CgpJIGZvY3VzIGluIHBhcnRpY3VsYXIgb24gdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhlIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgZG9jdW1lbnRlZCBieSB0aGUgc3R1ZGllcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3NlcnRhdGlvbuKAlHJlLWFuYWx5emVkIGFzIGluZGljYXRvcnMgb2YgdGhlIGJyb2FkZXIgImNvbmNlcHR1YWwgdW5pdHMiIGlkZW50aWZpZWQgaW4gQ2hhcHRlciBJSUnigJRtaWdodCBzaGVkIGxpZ2h0IG9uIHRoZSBfaGllcmFyY2hpY2FsIG9yZ2FuaXphdGlvbl8gb2YgdGhlc2UgY29uY2VwdHVhbCB1bml0cywgaS5lLiwgd2hpY2ggY29uY2VwdHVhbCB1bml0cyBtaWdodCBiZSBtb3JlIGJhc2ljIG9yIGZ1bmRhbWVudGFsIHZzLiBtb3JlIGNvbXBsZXgsIGFuZCB3aGV0aGVyIGFueSBvZiB0aGVzZSBjb25jZXB0dWFsIHVuaXRzIG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZSBjb25zaWRlcmVkIHRvIGRlcGVuZCBvbiB0aGUgcHJlc2VuY2Ugb2Ygb3RoZXJzLiBJbiBDaGFwdGVyIElJLCBJIGlsbHVzdHJhdGVkIHRoaXMgd2l0aCB0aGUgZm9sbG93aW5nIGV4YW1wbGU6IElmIG1hbnkgcGFydGljaXBhbnRzIGVuZG9yc2UgY2FwYWNpdGllcyBhc3NvY2lhdGVkIHdpdGggQ29uY2VwdHVhbCBVbml0IEEgd2l0aG91dCBlbmRvcnNpbmcgY2FwYWNpdGllcyBhc3NvY2lhdGVkIHdpdGggQ29uY2VwdHVhbCBVbml0IEIsIGJ1dCB2ZXJ5IGZldyBwYXJ0aWNpcGFudHMgZG8gdGhlIHJldmVyc2UgKGVuZG9yc2luZyBjYXBhY2l0aWVzIGFzc29jaWF0ZWQgd2l0aCBDb25jZXB0dWFsIFVuaXQgQiBidXQgbm90IENvbmNlcHR1YWwgVW5pdCBBKSwgdGhpcyBwcm92aWRlcyBzb21lIGV2aWRlbmNlIHRoYXQgQ29uY2VwdHVhbCBVbml0IEEgaXMgbW9yZSBiYXNpYyBvciBmdW5kYW1lbnRhbCB0aGFuIENvbmNlcHR1YWwgVW5pdCBCLCBvciB0aGF0IENvbmNlcHR1YWwgVW5pdCBCIHNvbWVob3cgZGVwZW5kcyBvbiAocGVyaGFwcyByZXF1aXJlcykgQ29uY2VwdHVhbCBVbml0IEEuIAoKSGVyZSBJIHdpbGwgdHJhbnNsYXRlIHRoaXMgZ2VuZXJhbCBpbnRlcmVzdCBpbiB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyBjb25jZXB0dWFsIHVuaXRzLCBhcyB3ZWxsIGFzIHRoZSBzcGVjaWZpYyBpbnR1aXRpb24gYWJvdXQgaG93IHRvIGRldGVjdCB0aGUga2luZHMgb2YgYXN5bW1ldHJpZXMgdGhhdCB3b3VsZCBiZSB0aGUgc2lnbmF0dXJlIG9mIGhpZXJhcmNoaWNhbCByZWxhdGlvbnNoaXBzLCBpbnRvIGEgc3BlY2lmaWMgYW5hbHlzaXMgcGxhbiB0byBiZSBhcHBsaWVkIHRvIGVhY2ggb2YgdGhlc2UgZGF0YXNldHMgaW4gdHVybi4gCgojIyBEZXRhaWxzIG9mIGFuYWx5c2VzCgpVbmxpa2UgdGhlIHByZXZpb3VzIGNoYXB0ZXIsIGluIHdoaWNoIEkgZW1wbG95ZWQgYSBjYW5vbmljYWwgYXBwcm9hY2ggdG8gaWRlbnRpZnlpbmcgbGF0ZW50IGNvbnN0cnVjdHMgdGhyb3VnaCBhbmFseXNlcyBvZiBjb3JyZWxhdGlvbiBzdHJ1Y3R1cmVz4oCUZXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzIChFRkEp4oCUaW4gdGhpcyBjaGFwdGVyIHRoZXJlIGlzIG5vIHRyaWVkLWFuZC10cnVlIG1ldGhvZCBmb3IgbWVldGluZyBteSBhbmFseXNpcyBnb2Fscy4gSW5zdGVhZCwgSSBjaGFydCBteSBvd24gY291cnNlIHRocm91Z2ggdGhlc2UgZGF0YXNldHMsIHVzaW5nIHRoZSBFRkEgc29sdXRpb25zIHJlcG9ydGVkIGluIENoYXB0ZXIgSUkgdG8gc2NvcmUgcGFydGljaXBhbnRzJyBlbmRvcnNlbWVudHMgb2YgZWFjaCBjb25jZXB0dWFsIHVuaXQgZm9yIHRoZSBwYXJ0aWN1bGFyIHRhcmdldCBjaGFyYWN0ZXIocykgdGhhdCB0aGV5IGFzc2Vzc2VkLCBleGFtaW5pbmcgdmlzdWFsaXphdGlvbnMgb2YgdGhlIGNvbXBsaWNhdGVkIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlc2UgZW5kb3JzZW1lbnRzLCBhbmQgdGhlbiBjb25kdWN0aW5nIG1vcmUgdGFyZ2V0ZWQgc3RhdGlzdGljYWwgYW5hbHlzZXMgb2Ygb25lIHBhcnRpY3VsYXIgYXNwZWN0IG9mIHRoZXNlIHJlbGF0aW9uc2hpcHM6IHRoZSBwb3NzaWJpbGl0eSBvZiBhc3ltbWV0cmllcyBpbiB0aGUgZW5kb3JzZW1lbnRzIG9mIHRoZXNlIGNvbmNlcHR1YWwgdW5pdHMuCgojIyMgU2NvcmluZyBlbmRvcnNlbWVudHMgb2YgY29uY2VwdHVhbCB1bml0cwoKVGhlIGZpcnN0IHN0ZXAgaW4gdGhlc2UgYW5hbHlzZXMgaXMgdG8gdHJhbnNmb3JtIHBhcnRpY2lwYW50cycgcmF0aW5ncyBvZiBpbmRpdmlkdWFsIG1lbnRhbCBjYXBhY2l0aWVzIGludG8gInNjb3JlcyIgdGhhdCBpbmRpY2F0ZSB0aGUgZXh0ZW50IHRvIHdoaWNoIHRoZXkgZW5kb3JzZWQgYSBwYXJ0aWN1bGFyIGNvbmNlcHR1YWwgdW5pdCBmb3IgdGhlIHRhcmdldCBjaGFyYWN0ZXIocykgdGhhdCB0aGV5IHdlcmUgYXNzaWduZWQgdG8gYXNzZXNzLiBUbyBkbyB0aGlzLCBJIG1ha2UgdXNlIG9mIHRoZSBFRkFzIHByZXNlbnRlZCBpbiBDaGFwdGVyIElJ4oCUd2hpY2ggb3JpZ2luYWxseSBzZXJ2ZWQgdG8gaWRlbnRpZnkgYSBzZXQgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBhIHBhcnRpY3VsYXIgc2FtcGxl4oCUdG8gYSBuZXcgZW5kOiB0aGUgY29uc3RydWN0aW9uIG9mICJzY2FsZXMiIGZvciBlYWNoIG9mIHRoZXNlIGNvbmNlcHR1YWwgdW5pdHMuIFNjYWxlIGNvbnN0cnVjdGlvbiBpcyBhIGNvbW1vbiB1c2Ugb2YgRUZBIGFuZCBzaW1pbGFyIGRpbWVuc2lvbmFsaXR5IHJlZHVjdGlvbiBhbmFseXNlcyAoaWYgYW55dGhpbmcsIG1vcmUgY29tbW9uIHRoYW4gdXNpbmcgRUZBIHRvIG1ha2UgdGhlIGtpbmRzIG9mIHRoZW9yZXRpY2FsIGFyZ3VtZW50cyBmZWF0dXJlZCBpbiBDaGFwdGVyIElJKS4KCkZvciBlYWNoIEVGQSBzb2x1dGlvbiwgSSBjb25zdHJ1Y3QgYSBzY2FsZSBmb3IgZWFjaCBvZiB0aGUgZmFjdG9ycyAoY29uY2VwdHVhbCB1bml0cykgaWRlbnRpZmllZCBieSB0aGF0IHNvbHV0aW9uLiBGaXJzdCwgSSBzb3J0IGVhY2ggb2YgdGhlIG1lbnRhbCBjYXBhY2l0aWVzIGluY2x1ZGVkIGluIHRoYXQgc3R1ZHkgaW50byBjYXRlZ29yaWVzIGJhc2VkIG9uIHRoZWlyIGxvYWRpbmdzIG9uIGVhY2ggb2YgdGhlIGZhY3RvcnMgaW4gdGhhdCBzb2x1dGlvbi4gRm9yIGVhY2ggbWVudGFsIGNhcGFjaXR5LCBJIGlkZW50aWZ5IHRoZSAiZG9taW5hbnQiIGZhY3RvciBhcyB0aGUgZmFjdG9yIHdpdGggdGhlIGxhcmdlc3QgcG9zaXRpdmUgZmFjdG9yIGxvYWRpbmcuIEZvciBleGFtcGxlLCBpZiB0aGUgbWVudGFsIGNhcGFjaXR5IF9mZWVsIGhhcHB5XyBoYWQgbG9hZGluZ3Mgb2YgMC42MCBvbiB0aGUgQk9EWSBmYWN0b3IsIDAuNzAgb24gdGhlIEhFQVJUIGZhY3RvciwgYW5kIDAuMzAgb24gdGhlIE1JTkQgZmFjdG9yLCBJIHdvdWxkIHNvcnQgaXQgaW50byB0aGUgSEVBUlQgY2F0ZWdvcnkuIEZvciBlYWNoIGZhY3RvciwgSSB0YWtlIHRoZSBzaXggaGlnaGVzdC1sb2FkaW5nIGl0ZW1zIGFzIGEgY2FuZGlkYXRlIHNjYWxlLCB0aGVuICJkcm9wIiB0aGUgY2FwYWNpdGllcyB3aXRoIHRoZSBzbWFsbGVzdCBmYWN0b3IgbG9hZGluZ3Mgb24gdGhlaXIgcmVzcGVjdGl2ZSBkb21pbmFudCBmYWN0b3JzIHVudGlsIEkgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgbWVudGFsIGNhcGFjaXRpZXMgaW4gZWFjaCBjYXRlZ29yeS4gRm9yIGV4YW1wbGUsIGlmIHRoZSBCT0RZIGZhY3RvciB3ZXJlIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIG5pbmUgbWVudGFsIGNhcGFjaXRpZXMsIHRoZSBIRUFSVCBmYWN0b3IgZm9yIHNpeCBtZW50YWwgY2FwYWNpdGllcywgYW5kIHRoZSBNSU5EIGZhY3RvciBmb3IgZml2ZSBjYXBhY2l0aWVzLCBmb3IgZWFjaCBmYWN0b3IgSSB3b3VsZCBrZWVwIG9ubHkgdGhlIGNhcGFjaXRpZXMgd2l0aCB0aGUgZml2ZSBoaWdoZXN0IHBvc2l0aXZlIGxvYWRpbmdzIG9uIHRoYXQgZmFjdG9yLCBpbiBvcmRlciB0byBjb25zdHJ1Y3QgdGhyZWUgc2NhbGVzIG9mIGVxdWFsIGxlbmd0aCAoYW5kIGEgbWF4aW11bSBsZW5ndGggb2Ygc2l4IGl0ZW1zKS4KClRvIGNhbGN1bGF0ZSBzY29yZXMgb24gdGhlc2Ugc2NhbGVzLCBJIHRha2UgdGhlIGF2ZXJhZ2Ugb2YgYWxsIG9mIG1lbnRhbCBjYXBhY2l0aWVzIGZvciBlYWNoIHNjYWxlLiBUaGlzIHlpZWxkcyBhIGRhdGFzZXQgaW4gd2hpY2ggZWFjaCBwYXJ0aWNpcGFudCBpcyBhc3NvY2lhdGVkIHdpdGggb25lIHNjb3JlIGZvciBlYWNoIG9mIHRoZSBjb25jZXB0dWFsIHVuaXRzIGlkZW50aWZpZWQgaW4gdGhlIHJlbGF0aXZlIEVGQSBzb2x1dGlvbiwgZm9yIGVhY2ggb2YgdGhlIHRhcmdldCBjaGFyYWN0ZXJzIHRoYXQgdGhhdCBwYXJ0aWNpcGFudCBhc3Nlc3NlZC4KCkluIHRoaXMgY2hhcHRlciwgSSBhcHBseSB0aGlzIG1ldGhvZCB0byBhbGwgb2YgdGhlIHRocmVlLWZhY3RvciBzb2x1dGlvbnMgZm9yIGFkdWx0IHNhbXBsZXMgYXMgcHJlc2VudGVkIGluIENoYXB0ZXIgSUkgKFN0dWRpZXMgMS00KSwgeWllbGRpbmcgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIHNjb3JlcyBmb3IgZWFjaCB0YXJnZXQgY2hhcmFjdGVyIGFzIGFzc2Vzc2VkIGJ5IGVhY2ggcGFydGljaXBhbnQuIChJIGlnbm9yZSB0aGUgYWJlcnJhbnQgZm91ci1mYWN0b3Igc29sdXRpb24gZm9yIGFkdWx0cyBpbiBTdHVkeSAyIHN1Z2dlc3RlZCBieSBvbmUgb2YgdGhlIHRocmVlIGZhY3RvciByZXRlbnRpb24gcHJvdG9jb2xzIGNvbnNpZGVyZWQgaW4gdGhhdCBjaGFwdGVyLCBzaW5jZSB0aGlzIHdhcyB0aGUgb25seSBzdHVkeSBvdXQgb2YgdGhlIHNldmVuIGNvbnNpZGVyZWQgaW4gd2hpY2ggYSBmb3VyLWZhY3RvciBzb2x1dGlvbiBhcHBlYXJlZCB0byBhZGQgYW55IHZhbHVlIGJleW9uZCB0aGUgcm9idXN0IEJPRFktSEVBUlQtTUlORCBmcmFtZXdvcmsgY29tbW9uIHRvIGFsbCBzdHVkaWVzLiBbWFggQVBQRU5ESVggQj9dKQoKRm9yIGNoaWxkIHNhbXBsZXMsIEkgYXBwbHkgdGhpcyBtZXRob2QgYm90aCB0byB0aGUgc29sdXRpb25zIGVtZXJnaW5nIGZyb20gY2hpbGRyZW4ncyBvd24gZGF0YSBhbmQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgX2FkdWx0XyBzb2x1dGlvbnMgZm9yIHRoZSBzdHVkaWVzIGluIHF1ZXN0aW9uLiBUaGlzIGFsbG93cyBtZSB0byBleHBsb3JlIGJvdGggdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgY2hpbGRyZW4ncyBvd24gY29uY2VwdHVhbCB1bml0cywgYW5kIHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIGEgZnVsbHkgYWR1bHQtbGlrZSBzZXQgb2YgY29uY2VwdHVhbCB1bml0cyAocHJlc3VtYWJseSwgdGhlIGNvbmNlcHR1YWwgdW5pdHMgdGhhdCB0aGVzZSBjaGlsZHJlbiB3aWxsIGV2ZW50dWFsbHkgY29tZSB0byBhZ3JlZSBvbiBhcyB0aGV5IG1hdHVyZSBpbnRvIGFkdWx0cykuIAoKRm9yICJvbGRlciIgY2hpbGRyZW4gKDctOXkgb2YgYWdlOyBTdHVkaWVzIDIgYW5kIDMpLCB0aGlzIG1lYW5zIGV4YW1pbmluZyB0d28gc2V0cyBvZiB0aHJlZSBjb25jZXB0dWFsIHVuaXRzIGZvciBlYWNoIHNhbXBsZSBvZiBjaGlsZHJlbjogKDEpIEJPRFksIEhFQVJULCBhbmQgTUlORCBhcyBkZWZpbmVkIGJ5IGFkdWx0cyBpbiB0aGF0IHN0dWR5OyBhbmQgKDIpIEJPRFksIEhFQVJULCBhbmQgTUlORCBhcyBkZWZpbmVkIGJ5IHRoZSBjaGlsZHJlbiB0aGVtc2VsdmVzLiBCZWNhdXNlIHRoZSBFRkFzIGZvciBvbGRlciBjaGlsZHJlbiBhbmQgYWR1bHRzIGFyZSBzbyBzaW1pbGFyIChzZWUgQ2hhcHRlciBJSSksIEkgZXhwZWN0IHRoZSBvdXRjb21lcyBvZiB0aGVzZSB0d28gYXBwcm9hY2hlcyB0byBjb25zdHJ1Y3RpbmcgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIHNjYWxlcyB0byB5aWVsZCB2ZXJ5IHNpbWlsYXIgcmVzdWx0cyBpbiB0aGlzIGFnZSBncm91cC4KCkZvciAieW91bmdlciIgY2hpbGRyZW4sIHRoaXMgbWVhbnMgZXhhbWluaW5nIG11bHRpcGxlIHNldHMgb2YgY29uY2VwdHVhbCB1bml0cyBmb3IgZWFjaCBzYW1wbGUgb2YgY2hpbGRyZW4sIGluY2x1ZGluZyAoMSkgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIGFzIGRlZmluZWQgYnkgYWR1bHRzIGluIHRoYXQgc3R1ZHk7IGFuZCAoMikgdmFyeWluZyBzZXRzIG9mIDItNCBjb25jZXB0dWFsIHVuaXRzIGFzIGRlZmluZWQgYnkgRUZBIG9mIGNoaWxkcmVuJ3Mgb3duIHJlc3BvbnNlcywgdXNpbmcgZGlmZmVyZW50IGZhY3RvciByZXRlbnRpb24gcHJvdG9jb2xzLiBUaGUgRUZBcyBvZiB5b3VuZ2VyIGNoaWxkcmVuJ3MgcmVzcG9uc2VzICB3ZXJlIGxlc3MgcmVsaWFibGUsIGFuZCBsZXNzIGFkdWx0LWxpa2UsIHRoYW4gdGhvc2Ugb2Ygb2xkZXIgY2hpbGRyZW4uIEFzIGEgY29uc2VxdWVuY2UsIEkgZXhwZWN0IHRoZSBvdXRjb21lcyBvZiB0aGVzZSBkaWZmZXJlbnQgYXBwcm9hY2hlcyB0byBjb25zdHJ1Y3Rpbmcgc2NhbGVzIGZvciBlYWNoIGNvbmNlcHR1YWwgdW5pdCB0byB5aWVsZCByYXRoZXIgZGlmZmVyZW50IHJlc3VsdHMgaW4gdGhpcyBhZ2UgZ3JvdXAuCgpUaGUgcmVhZGVyIHNob3VsZCBub3RlIHRoYXQgdGhpcyBpcyBmYXIgZnJvbSB0aGUgb25seSB3YXkgdG8gYXBwcm9hY2ggInNjb3JpbmciIHBhcnRpY2lwYW50cyBvbiB0aGVzZSBjb25jZXB0dWFsIHVuaXRzLiBJbiBwYXJ0aWN1bGFyLCBJIGNvdWxkIGhhdmUgZXhhbWluZWQgZmFjdG9yIHNjb3Jlc+KAlHN1bW1hcmllcyBvZiBlYWNoIGZhY3RvciAoY29uY2VwdHVhbCB1bml0KSBiYXNlZCBvbiBhIHBhcnRpY2lwYW50J3MgcmVzcG9uc2VzIHRvIGFsbCBtZW50YWwgY2FwYWNpdGllcyBhbmQgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBhbGwgbWVudGFsIGNhcGFjaXRpZXMgYW5kIGFsbCBmYWN0b3JzIGluY2x1ZGVkIGluIHRoYXQgRUZBIHNvbHV0aW9u4oCUcmF0aGVyIHRoYW4gY29uc3RydWN0aW5nICJzY2FsZXMiIGluIHRoZSB3YXkgSSBoYXZlIGp1c3Qgb3V0bGluZWQuIEhvd2V2ZXIsIG11Y2ggbGlrZSBfel8tc2NvcmVzLCBmYWN0b3Igc2NvcmVzIGluZGljYXRlIHdoZXJlIGEgcGFydGljaXBhbnQgZmFsbHMgaW4gcmVsYXRpb24gdG8gb3RoZXIgcGFydGljaXBhbnRzIGluIHRoZSBzYW1wbGUsIGFuZCBkbyBub3QgcHJvdmlkZSB0aGUga2luZCBvZiBhYnNvbHV0ZSBzY29yZSB0aGF0IGlzIGtleSB0byBteSBnb2FsIGluIHRoaXMgY2hhcHRlciwgd2hpY2ggaXMgdG8gYW5hbHl6ZSByZWxhdGlvbnNoaXBzIGFtb25nIGZhY3RvcnMgaW4gdGVybXMgb2YgdGhlIGV4dGVudCB0byB3aGljaCBpbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBpbmRpY2F0ZWQgdGhhdCB0YXJnZXQgY2hhcmFjdGVycyAicG9zc2Vzc2VkIiB0aGUgY29uY2VwdHVhbCB1bml0cyBCT0RZLCBIRUFSVCwgYW5kIE1JTkQuIFtYWCBBUFBFTkRJWCBCP10KCkV2ZW4gd2l0aGluIHRoZSAic2NhbGUiIGFwcHJvYWNoIGRlc2NyaWJlZCBpbiB0aGlzIHNlY3Rpb24sIHRoZXJlIGFyZSBtYW55IHBhcmFtZXRlcnMgb2YgdGhpcyBhbmFseXNpcyB0aGF0IEkgY291bGQgaGF2ZSBzZXQgZGlmZmVyZW50bHkuIEZvciBleGFtcGxlLCBJIGNvdWxkIGhhdmUgY29uc2lkZXJlZCBhYnNvbHV0ZSBmYWN0b3IgbG9hZGluZ3MgcmF0aGVyIHRoYW4gcmF3IGZhY3RvciBsb2FkaW5ncywgd2hpY2ggd291bGQgYWxsb3cgZm9yIG1lbnRhbCBjYXBhY2l0aWVzIHRoYXQgbG9hZGVkIGVzcGVjaWFsbHkgc3Ryb25nbHkgX25lZ2F0aXZlbHlfIG9uIGEgcGFydGljdWxhciBmYWN0b3IgdG8gY29udHJpYnV0ZSAobmVnYXRpdmVseSkgdG8gc2NvcmVzIG9uIHRoYXQgY29uY2VwdHVhbCB1bml0OyBJIGNvdWxkIGhhdmUgb21pdHRlZCB0aGUgc3RlcCBvZiBtYWtpbmcgdGhlIHNjYWxlcyBmb3IgYWxsIGZhY3RvcnMgd2l0aGluIGEgc2luZ2xlIEVGQSBzb3RsdWlvbiBlcXVhbCBsZW5ndGg7IEkgY291bGQgaGF2ZSBjaG9zZW4gdG8gdXNlIG9ubHkgdGhlIHRvcCA0IG9yIDUgbWVudGFsIGNhcGFjaXRpZXMgYWNyb3NzIGFsbCBFRkEgc29sdXRpb25zLCBvciB0byBzZXQgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiBpdGVtcyBpbiBhIHNjYWxlOyBvciBJIGNvdWxkIGhhdmUgaW1wbGVtZW50ZWQgYWJzb2x1dGUgdGhyZXNob2xkcyBmb3IgaG93IHN0cm9uZ2x5IGEgbWVudGFsIGNhcGFjaXR5IG11c3QgbG9hZCBvbiBhIGZhY3RvciBpbiBvcmRlciB0byBjb3VudCB0b3dhcmQgdGhlIHNjb3JlIGZvciB0aGF0IGNvbmNlcHR1YWwgdW5pdCwgb3IgYWJzb2x1dGUgbGltaXRzIG9uIHRoZSBkZWdyZWUgdG8gd2hpY2ggYSBtZW50YWwgY2FwYWNpdHkgY2FuICJjcm9zcy1sb2FkIiBvbiBub24tZG9taW5hbnQgZmFjdG9ycyBhbmQgc3RpbGwgY291bnQgdG93YXJkIHRoZSBzY29yZSBmb3IgYW55IG9uZSBjb25jZXB0dWFsIHVuaXQuIFtYWCBBUFBFTkRJWCBCP10gSG93ZXZlciwgdGhlc2Uga2luZHMgb2YgZGV0YWlscyBkaWZmZXIgcXVpdGUgZHJhbWF0aWNhbGx5IGFjcm9zcyBzdHVkaWVzIGFuZCBhZ2UgZ3JvdXBzLiBGb3IgZXhhbXBsZSwgaW4gc29tZSBzYW1wbGVzIHRoZXJlIGFyZSBubyBzdHJvbmcgbmVnYXRpdmUgZmFjdG9yIGxvYWRpbmdzLCBhbmQgaW4gb3RoZXJzIHRoZXJlIGFyZTsgaWYgSSBjb25zaWRlcmVkIGFic29sdXRlIGxvYWRpbmdzIHJhdGhlciB0aGFuIHJhdyBsb2FkaW5ncywgSSBjb3VsZCBlbmQgdXAgY29tcGFyaW5nIHNjb3JlcyBmcm9tIGEgImJpcG9sYXIiIHNjYWxlIGluIG9uZSBzYW1wbGUgdG8gc2NvcmVzIGZyb20gYSAidW5pcG9sYXIiIHNjYWxlcyBpbiBhbm90aGVyIHNhbXBsZSwgbWFraW5nIHRoZSBjb21wYXJpc29uIG1vcmUgZGlmZmljdWx0IHRvIGludGVycHJldC4gTGlrZXdpc2UsIHNvbWUgRUZBIHNvbHV0aW9ucyB0ZW5kZWQgdG8gZmVhdHVyZSBnZW5lcmFsbHkgd2Vha2VyIGZhY3RvciBsb2FkaW5ncyB0aGFuIG90aGVyczsgaWYgSSB3ZXJlIHRvIGltcG9zZSBhYnNvbHV0ZSB0aHJlc2hvbGRzIGZvciB0aGUgc3RyZW5ndGggb2YgZmFjdG9yIGxvYWRpbmdzLCBJIGNvdWxkIGVuZCB1cCBjb21wYXJpbmcgc2NvcmVzIGZyb20gc2NhbGVzIG9mIHdpbGRseSBkaWZmZXJlbnQgbGVuZ3RocyBhY3Jvc3Mgc2FtcGxlcy4gSW4gbXkgdmlldywgdGhlIGFuYWx5c2lzIGRlY2lzaW9ucyBvdXRsaW5lZCBhYm92ZSBtYXhpbWl6ZSBjb21wYXJhYmlsaXR5IGFjcm9zcyBzdHVkaWVzIGFuZCBhZ2UgZ3JvdXBz4oCUdGhlIHByaW1hcnkgZ29hbCBvZiB0aGlzIGNoYXB0ZXIuIChOb3RlLCBob3dldmVyLCB0aGF0IGluIHRoZSBhbmFseXNpcyBjb2RlIGZvciB0aGlzIGNoYXB0ZXIgSSBoYXZlIGluY2x1ZGVkIGVhc3kgc2hvcnQgY3V0cyBmb3IgdGhlIGludGVyZXN0ZWQgcmVhZGVyIHRvIGV4cGxvcmUgZGlmZmVyZW50IG9wdGlvbnMgZm9yIGVhY2ggb2YgdGhlc2UgcGFyYW1ldGVycy4pCgpgYGB7cn0KIyBzZWUgIi4vc2NyaXB0cy9vcmdfcGFyYW0uUiIgZm9yIHBhcmFtZXRlciBzZXR0aW5nCmBgYAoKIyMjIFZpc3VhbGl6aW5nIHJlbGF0aW9uc2hpcHMKClhYCgpvdXRsaW5lOgoKLSBmb3IgYW55IHNhbXBsZSwgSSBoYXZlIGlkZW50aWZpZWQgcmVsZXZhbnQgY29uY2VwdHVhbCB1bml0cyAoY2hhcHRlciBJSSkgYW5kIHNjb3JlZCBlYWNoIHBhcnRpY2lwYW50J3MgZW5kb3JzZW1lbnQgb2YgZWFjaCBvZiB0aGVzZSB1bml0cyBmb3IgdGhlaXIgYXNzaWduZWQgdGFyZ2V0IGNoYXJhY3RlcihzKSAocHJldmlvdXMgc2VjdGlvbikKLSBub3csIEkgd2FudCB0byBhc3Nlc3MgdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlc2UgZW5kb3JzZW1lbnRzIAotIGJ1dCBJIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdG8gZXhwZWN0LCBhbmQgdGhlc2UgcmVsYXRpb25zaGlwcyBjb3VsZCBiZSB2ZXJ5IGNvbXBsZXgKLSBzbywgc3RhcnQgd2l0aCBob2xpc3RpYywgZXhwbG9yYXRvcnkgdmlzdWFsaXphdGlvbjogc2NhdHRlcnBsb3RzIG9mIHBhaXJzIG9mIGNvbmNlcHR1YWwgdW5pdHMKCgojIyMgRm9ybWFsIGFuYWx5c2VzIG9mIGFzeW1tZXRyaWVzCgpYWAoKb3V0bGluZToKCi0gbm93LCBhIG1vcmUgdGFyZ2V0ZWQgYXBwcm9hY2ggdG8gb25lIHBhcnRpY3VsYXIgYXNwZWN0IG9mIHRoZXNlIHJlbGF0aW9uc2hpcHM6IGFzeW1tZXRyaWVzCi0gcmVtaW5kZXIgb2YgYmFzaWMgaW50dWl0aW9uOiBpbiB0aGlzIHNhbXBsZSwgZG8gcGFydGljaXBhbnRzIHRlbmQgdG8gZW5kb3JzZSBBIHdpdGhvdXQgQj8gQiB3aXRob3V0IEE/IGlzIHRoZXJlIGFuIGFzeW1tZXRyeSBoZXJlPwotIGNvbm5lY3QgdG8gdGhlIHZpc3VhbGl6YXRpb25zOiBhc3ltbWV0cmllcyBvZiBwb2ludHMgYXJvdW5kIHRoZSB5PXggbGluZSBvZiBlcXVpdmFsZW5jZQotIG9uZSB3YXkgdG8gYm9pbCB0aGlzIGRvd24gdG8gYSBudW1iZXI6IGRpZmZlcmVuY2Ugc2NvcmVzIChmb3IgZWFjaCBwYWlyKSwgY29tcGFyaXNvbnMgdG8gMCB2aWEgYmF5ZXNpYW4gcmVncmVzc2lvbnMKLSBmb3IgYW55IHBhaXI6IGlmIDAsIG5vIGV2aWRlbmNlIGZvciBoaWVyYXJjaHkuIGlmIG5vbi16ZXJvLCBzb21lIGV2aWRlbmNlLgotIGNvbXBhcmlzb25zIGFjcm9zcyBwYWlyczogZnVydGhlciBmcm9tIDAsIG1vcmUgaGllcmFyY2hpY2FsLgotIGNhdmVhdCAxOiB0aGVzZSBhcmUgcG9zdC1ob2MgYW5hbHlzZXMhIGJ1dCBzdGlsbCB1c2luZyBjb25maXJtYXRvcnkgc3RhdHMuIAotIGNhdmVhdCAyOiBzY29yZXMgb2YgKDAsMCkgdHJlYXRlZCBzYW1lIGFzIHNjb3JlcyBvZiAoNiw2KSwgb3IgYW55d2hlcmUgaW4gYmV0d2Vlbi4KLSBtYXhpbWFsIHJhbmRvbSBlZmZlY3RzIHN0cnVjdHVyZXMgKGkuZS4sIHJhbmRvbSBpbnRlcmNlcHRzIGZvciBwYXJ0aWNpcGFudHMgb25seSBmb3IgU3R1ZGllcyAxYyBhbmQgNCkKCgojIFN0dWR5IDE6IEFuIGFkdWx0IGVuZHBvaW50CgpJbiB0aGUgY29udGV4dCBvZiB0aGlzIGRpc3NlcnRhdGlvbiwgU3R1ZHkgMSBzZXJ2ZXMgdGhlIHJvbGUgb2YgZGVzY3JpYmluZyBhIGRldmVsb3BtZW50YWwgZW5kcG9pbnQgZm9yIGNvbmNlcHR1YWwgcmVwcmVzZW50YXRpb25zIG9mIG1lbnRhbCBsaWZlLiBJbiB0aGlzIGNoYXB0ZXIsIEkgZm9jdXMgb24gd2hhdCB0aGVzZSBzdHVkaWVzIGNhbiByZXZlYWwgYWJvdXQgdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlIGNvbmNlcHR1YWwgdW5pdHMgZGlzY3Vzc2VkIGluIENoYXB0ZXIgSUlJLiBUaGVzZSBhbmFseXNlcyB3ZXJlIG5vdCBwYXJ0IG9mIHRoZSBvcmlnaW5hbCBwdWJsaWNhdGlvbiBvZiB0aGVzZSBzdHVkaWVzIChXZWlzbWFuIGV0IGFsLiwgMjAxNykuCgpUaGVzZSBzdHVkaWVzIGFsbCBlbXBsb3llZCB0aGUgImVkZ2UgY2FzZSIgdmFyaWFudCBvZiB0aGUgZ2VuZXJhbCBhcHByb2FjaCwgd2l0aCBwYXJ0aWNpcGFudHMgYXNzZXNzaW5nIHRoZSBtZW50YWwgY2FwYWNpdGllcyBvZiBhIGJlZXRsZSBhbmQvb3IgYSByb2JvdC4gKFNlZSBDaGFwdGVyIElJIGFuZCBXZWlzbWFuIGV0IGFsLiwgMjAxNywgZm9yIGRldGFpbGVkIG1ldGhvZHMuKQoKU3R1ZGllcyAxYSBhbmQgMWIgZW1wbG95ZWQgaWRlbnRpY2FsIG1ldGhvZHM6IFVTIGFkdWx0cyAoU3R1ZHkgMWE6IF9uXz1gciBucm93KGQxYV9hZF93aWRlKWA7IFN0dWR5IDFiOiBfbl89YHIgbnJvdyhkMWJfYWRfd2lkZSlgKSBlYWNoIGFzc2Vzc2VkIGEgc2luZ2xlIHRhcmdldCBjaGFyYWN0ZXIgb24gNDAgbWVudGFsIGNhcGFjaXRpZXMuIFN0dWR5IDFjIGVtcGxveWVkIHZlcnkgc2ltaWxhciBtZXRob2RzLCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCBwYXJ0aWNpcGFudHMgKF9uXz1gciBucm93KGQxY19hZF93aWRlKS8yYCkgZWFjaCBhc3Nlc3NlZCBfYm90aF8gdGFyZ2V0IGNoYXJhY3RlcnMgc2lkZSBieSBzaWRlICh3aXRoIGxlZnQtcmlnaHQgcG9zaXRpb24gY291bnRlcmJhbGFuZWQgYWNyb3NzIHBhcnRpY2lwYW50cykuCgpJbiBTdHVkeSAxZCwgYHIgbnJvdyhkMWRfYWRfd2lkZSlgIFVTIGFkdWx0cyBlYWNoIGFzc2Vzc2VkIGEgc2luZ2xlIHRhcmdldCBjaGFyYWN0ZXIgb24gNDAgbWVudGFsIGNhcGFjaXRpZXMuIFVubGlrZSBTdHVkaWVzIDFhLTFjLCB0aGlzIHN0dWR5IGVtcGxveWVkIHRoZSAibWFueSBjaGFyYWN0ZXJzIiB2YXJpYW50IG9mIHRoZSBnZW5lcmFsIGFwcHJvYWNoLCBpbiB3aGljaCBwYXJ0aWNpcGFudHMgd2VyZSByYW5kb21seSBhc3NpZ25lZCB0byBhc3Nlc3Mgb25lIG9mIHRoZSBmb2xsb3dpbmcgMjEgdGFyZ2V0IGNoYXJhY3RlcnM6IGFuIGFkdWx0LCBhIGNoaWxkLCBhbiBpbmZhbnQsIGEgcGVyc29uIGluIGEgcGVyc2lzdGVudCB2ZWdldGF0aXZlIHN0YXRlLCBhIGZldHVzLCBhIGNoaW1wYW56ZWUsIGFuIGVsZXBoYW50LCBhIGRvbHBoaW4sIGEgYmVhciwgYSBkb2csIGEgZ29hdCwgYSBtb3VzZSwgYSBmcm9nLCBhIGJsdWUgamF5LCBhIGZpc2gsIGEgYmVldGxlLCBhIG1pY3JvYmUsIGEgcm9ib3QsIGEgY29tcHV0ZXIsIGEgY2FyLCBvciBhIHN0YXBsZXIuIAoKKFNlZSBDaGFwdGVyIElJIGFuZCBXZWlzbWFuIGV0IGFsLiwgMjAxNywgZm9yIGRldGFpbGVkIG1ldGhvZHMuKQoKQmVjYXVzZSBTdHVkaWVzIDFhLCAxYiwgYW5kIDFjIHNoYXJlZCBzaW1pbGFyIG1ldGhvZHMgYW5kIHlpZWxkZWQgc2ltaWxhciByZXN1bHRzIGJvdGggd2l0aCByZXNwZWN0IHRvIHRoZSBjb25jZXB0dWFsIHVuaXRzIHJldmVhbGVkIGJ5IEVGQSAoQ2hhcHRlciBJSUkpIGFuZCB3aXRoIHJlc3BlY3QgdG8gdGhlIG9yZ2FuaXphdGlvbiBvZiB0aGVzZSBjb25jZXB0dWFsIHVuaXRzICh0aGlzIGNoYXB0ZXIpLCBJIHdpbGwgZGlzY3VzcyB0aGVzZSBzdHVkaWVzIGFzIGEgZ3JvdXAgYmVmb3JlIG1vdmluZyBvbiB0byBTdHVkeSAxZC4KCiMjIFNwZWNpYWwgbm90ZXMgb24gZGF0YSBwcm9jZXNzaW5nIGFuZCBhbmFseXNpcwoKQXMgbm90ZWQgaW4gQ2hhcHRlciBJSSwgaW4gdGhlIG9yaWdpbmFsIGFuYWx5c2lzIG9mIHRoZXNlIGRhdGFzZXRzIHJlc3BvbnNlcyB3ZXJlIHJlY29kZWQgdG8gcnVuIGZyb20gLTMgdG8gKzMgYmVmb3JlIGFuYWx5c2VzIChXZWlzbWFuIGV0IGFsLiwgMjAxNyk7IGluIHRoaXMgZGlzc2VydGF0aW9uLCBJIG1haW50YWluIHRoZSAwLTYgY29kaW5nIGZvciBjb21wYXJhYmlsaXR5IHRvIFN0dWRpZXMgMi00LgoKIyMgUmVzdWx0cwoKIyMjIFN0dWRpZXMgMWEtMWMKCiMjIyMgU2NhbGUgY29uc3RydWN0aW9uCgpgYGB7cn0Kc2NhbGVzX2VmYV93ZG1fZDFhX2FkIDwtIHNjYWxlX2Z1bihlZmFfd2RtX2QxYV9hZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2VmYV93ZG1fZDFhX2FkKQpkMWFfYWRfc2NvcmVkX2FkIDwtIHNjb3JlX2Z1bihkMWFfYWQsIHNjYWxlc19lZmFfd2RtX2QxYV9hZCkKCnNhdmVSRFMoc2NhbGVzX2VmYV93ZG1fZDFhX2FkLCBmaWxlID0gIi4vc3RvcmVkL3NjYWxlcy9zY2FsZXNfZWZhX3dkbV9kMWFfYWQiKQpzYXZlUkRTKGQxYV9hZF9zY29yZWRfYWQsIGZpbGUgPSAiLi9zdG9yZWQvc2NvcmVkX2RhdGEvZDFhX2FkX3Njb3JlZF9hZCIpCmBgYAoKYGBge3J9CnNjYWxlc19lZmFfd2RtX2QxYl9hZCA8LSBzY2FsZV9mdW4oZWZhX3dkbV9kMWJfYWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxYl9hZCkKZDFiX2FkX3Njb3JlZF9hZCA8LSBzY29yZV9mdW4oZDFiX2FkLCBzY2FsZXNfZWZhX3dkbV9kMWJfYWQpCgpzYXZlUkRTKHNjYWxlc19lZmFfd2RtX2QxYl9hZCwgZmlsZSA9ICIuL3N0b3JlZC9zY2FsZXMvc2NhbGVzX2VmYV93ZG1fZDFiX2FkIikKc2F2ZVJEUyhkMWJfYWRfc2NvcmVkX2FkLCBmaWxlID0gIi4vc3RvcmVkL3Njb3JlZF9kYXRhL2QxYl9hZF9zY29yZWRfYWQiKQpgYGAKCmBgYHtyfQpzY2FsZXNfZWZhX3dkbV9kMWNfYWQgPC0gc2NhbGVfZnVuKGVmYV93ZG1fZDFjX2FkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JfbmFtZXMgPSBmYWN0b3JfbmFtZXNfZWZhX3dkbV9kMWNfYWQpCmQxY19hZF9zY29yZWRfYWQgPC0gc2NvcmVfZnVuKGQxY19hZCwgc2NhbGVzX2VmYV93ZG1fZDFjX2FkKQoKc2F2ZVJEUyhzY2FsZXNfZWZhX3dkbV9kMWNfYWQsIGZpbGUgPSAiLi9zdG9yZWQvc2NhbGVzL3NjYWxlc19lZmFfd2RtX2QxY19hZCIpCnNhdmVSRFMoZDFjX2FkX3Njb3JlZF9hZCwgZmlsZSA9ICIuL3N0b3JlZC9zY29yZWRfZGF0YS9kMWNfYWRfc2NvcmVkX2FkIikKYGBgCgpgYGB7cn0Kc2NhbGVzX2VmYV93ZG1fZDFkX2FkIDwtIHNjYWxlX2Z1bihlZmFfd2RtX2QxZF9hZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2VmYV93ZG1fZDFkX2FkKQpkMWRfYWRfc2NvcmVkX2FkIDwtIHNjb3JlX2Z1bihkMWRfYWQsIHNjYWxlc19lZmFfd2RtX2QxZF9hZCkKCnNhdmVSRFMoc2NhbGVzX2VmYV93ZG1fZDFkX2FkLCBmaWxlID0gIi4vc3RvcmVkL3NjYWxlcy9zY2FsZXNfZWZhX3dkbV9kMWRfYWQiKQpzYXZlUkRTKGQxZF9hZF9zY29yZWRfYWQsIGZpbGUgPSAiLi9zdG9yZWQvc2NvcmVkX2RhdGEvZDFkX2FkX3Njb3JlZF9hZCIpCmBgYAoKYGBge3J9CmZhY3RfbmFtZV9mdW4oZmFjdG9yX25hbWVzX2VmYV93ZG1fZDFhX2FkKQpmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxYl9hZCkKZmFjdF9uYW1lX2Z1bihmYWN0b3JfbmFtZXNfZWZhX3dkbV9kMWNfYWQpCgpzY2FsZXNfZWZhX3dkbV9kMWFfYWQgJT4lIGNvdW50KGZhY3RvcikgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihuKSkgJT4lIHNlbGVjdChtZWFuKSAlPiUgYXMubnVtZXJpYygpCnNjYWxlc19lZmFfd2RtX2QxYl9hZCAlPiUgY291bnQoZmFjdG9yKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG4pKSAlPiUgc2VsZWN0KG1lYW4pICU+JSBhcy5udW1lcmljKCkKc2NhbGVzX2VmYV93ZG1fZDFjX2FkICU+JSBjb3VudChmYWN0b3IpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4obikpICU+JSBzZWxlY3QobWVhbikgJT4lIGFzLm51bWVyaWMoKQpgYGAKCkZvciBlYWNoIG9mIHRoZXNlIHRocmVlIHN0dWRpZXMsIGZvbGxvd2luZyB0aGUgc3RlcHMgZGVzY3JpYmVkIGluICJHZW5lcmFsIGFuYWx5c2lzIHBsYW4sIiBhYm92ZSwgeWllbGRlZCBgciBmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QxYV9hZClgIHNjYWxlcyBvZiBgciBzY2FsZXNfZWZhX3dkbV9kMWFfYWQgJT4lIGNvdW50KGZhY3RvcikgJT4lIHN1bW1hcmlzZShtZWFuID0gbWVhbihuKSkgJT4lIHNlbGVjdChtZWFuKSAlPiUgYXMubnVtZXJpYygpYCBpdGVtcyBlYWNoLCB3aXRoIGEgbGFyZ2UgZGVncmVlIG9mIG92ZXJsYXAgaW4gaXRlbXMgYWNyb3NzIHN0dWRpZXM7IHNlZSBUYWJsZSA0LnguCgpgYGB7cn0Kc2NhbGVzX3N0dWR5MSA8LSBiaW5kX3Jvd3Moc2NhbGVzX2VmYV93ZG1fZDFhX2FkICU+JSBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgMWEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzX2VmYV93ZG1fZDFiX2FkICU+JSBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgMWIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzX2VmYV93ZG1fZDFjX2FkICU+JSBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgMWMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzX2VmYV93ZG1fZDFkX2FkICU+JSBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgMWQiKSkgJT4lCiAgc2VsZWN0KC1jKGxvYWRpbmcsIG9yZGVyKSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBzcHJlYWQoc3R1ZHksIGZhY3RvcikgJT4lCiAgbXV0YXRlKHVyX2ZhY3RvciA9IGlmZWxzZSghaXMubmEoYFN0dWR5IDFhYCksIGBTdHVkeSAxYWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoIWlzLm5hKGBTdHVkeSAxYmApLCBgU3R1ZHkgMWJgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSghaXMubmEoYFN0dWR5IDFjYCksIGBTdHVkeSAxY2AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBTdHVkeSAxZGApKSkpICU+JQogIGxlZnRfam9pbihzY2FsZXNfZWZhX3dkbV9kMWFfYWQgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgb3JkZXIpICU+JSByZW5hbWUob3JkZXIxYSA9IG9yZGVyKSkgJT4lCiAgbGVmdF9qb2luKHNjYWxlc19lZmFfd2RtX2QxYl9hZCAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBvcmRlcikgJT4lIHJlbmFtZShvcmRlcjFiID0gb3JkZXIpKSAlPiUKICBsZWZ0X2pvaW4oc2NhbGVzX2VmYV93ZG1fZDFjX2FkICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoY2FwYWNpdHksIG9yZGVyKSAlPiUgcmVuYW1lKG9yZGVyMWMgPSBvcmRlcikpICU+JQogIGxlZnRfam9pbihzY2FsZXNfZWZhX3dkbV9kMWRfYWQgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgb3JkZXIpICU+JSByZW5hbWUob3JkZXIxZCA9IG9yZGVyKSkgJT4lCiAgYXJyYW5nZSh1cl9mYWN0b3IsIG9yZGVyMWEsIG9yZGVyMWIsIG9yZGVyMWMsIG9yZGVyMWQpICU+JQogIHNlbGVjdCgtYyh1cl9mYWN0b3IsIHN0YXJ0c193aXRoKCJvcmRlciIpKSkKYGBgCgpgYGB7cn0KdGFibGU0LnggPC0gc2NhbGVzX3N0dWR5MSAlPiUKICBtdXRhdGVfYXQodmFycygtY2FwYWNpdHkpLAogICAgICAgICAgICBmdW5zKGlmZWxzZShpcy5uYSguKSwgIiIsICLinJMiKSkpICU+JQogIHJlbmFtZShDYXBhY2l0eSA9IGNhcGFjaXR5KSAlPiUKICBrYWJsZShmb3JtYXQgPSAiaHRtbCIsIAogICAgICAgIGNhcHRpb24gPSAiVGFibGUgNC54OiBTY2FsZXMgZm9yIGVhY2ggb2YgdGhlIGNvbmNlcHR1YWwgdW5pdHMgKGZhY3RvcnMpIGlkZW50aWZpZWQgYnkgRUZBIGZvciBVUyBBZHVsdHMgaW4gU3R1ZGllcyAxYS0xZCAoc2VlIENoYXB0ZXIgSUlJKS4gQSBjaGVja21hcmsgaW5kaWNhdGVzIHRoYXQgYSBtZW50YWwgY2FwYWNpdHkgd2FzIGluY2x1ZGVkIGluIGEgc2NhbGUgZm9yIGEgcGFydGljdWxhciBzdHVkeS4iKSAlPiUgIAogIGthYmxlX3N0eWxpbmcoKSAlPiUKICBncm91cF9yb3dzKCJCT0RZIHNjYWxlIiwgMSwgOSkgJT4lCiAgZ3JvdXBfcm93cygiSEVBUlQgc2NhbGUiLCAxMCwgMTcpICU+JQogIGdyb3VwX3Jvd3MoIk1JTkQgc2NhbGUiLCAxOCwgMjYpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQp0YWJsZTQueApgYGAKCiMjIyMgVmlzdWFsaXphdGlvbgoKYGBge3J9CnBsb3RzX2QxYV9hZF9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkMWFfYWRfc2NvcmVkX2FkKQpgYGAKCmBgYHtyfQpmaWdfZDFhX2FkX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kMWFfYWRfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMWFfYWRfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMWFfYWRfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBMSIsICJBMiIsICJBMyIpLCBuY29sID0gMykKCmZpZ19kMWFfYWRfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfZDFhX2FkX3Njb3JlZF9hZFtbMV1dICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpKQoKZmlnX2QxYV9hZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kMWFfYWRfcGxvdHMsIGZpZ19kMWFfYWRfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kMWFfYWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAxYTogQWR1bHRzIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kMWFfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDFhX2FkX3RpdGxlLCBmaWdfZDFhX2FkX3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3J9CnBsb3RzX2QxYl9hZF9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkMWJfYWRfc2NvcmVkX2FkKQpgYGAKCmBgYHtyfQpmaWdfZDFiX2FkX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kMWJfYWRfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMWJfYWRfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMWJfYWRfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJCMSIsICJCMiIsICJCMyIpLCBuY29sID0gMykKCmZpZ19kMWJfYWRfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfZDFiX2FkX3Njb3JlZF9hZFtbMV1dICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpKQoKZmlnX2QxYl9hZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kMWJfYWRfcGxvdHMsIGZpZ19kMWJfYWRfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kMWJfYWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAxYjogQWR1bHRzIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kMWJfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDFiX2FkX3RpdGxlLCBmaWdfZDFiX2FkX3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3J9CnBsb3RzX2QxY19hZF9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkMWNfYWRfc2NvcmVkX2FkKQpgYGAKCmBgYHtyfQpmaWdfZDFjX2FkX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kMWNfYWRfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMWNfYWRfc2NvcmVkX2FkW1syXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMWNfYWRfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDMSIsICJDMiIsICJDMyIpLCBuY29sID0gMykKCmZpZ19kMWNfYWRfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfZDFjX2FkX3Njb3JlZF9hZFtbMV1dICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMikpKQoKZmlnX2QxY19hZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kMWNfYWRfcGxvdHMsIGZpZ19kMWNfYWRfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kMWNfYWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAxYzogQWR1bHRzIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kMWNfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDFjX2FkX3RpdGxlLCBmaWdfZDFjX2FkX3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3J9CnBsb3RzX2QxZF9hZF9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkMWRfYWRfc2NvcmVkX2FkLCBjb2xvcnMgPSBjb2xvcnMyMSkKYGBgCgpgYGB7cn0KZmlnX2QxZF9hZF9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDFkX2FkX3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDFkX2FkX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfZDFkX2FkX3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRDEiLCAiRDIiLCAiRDMiKSwgbmNvbCA9IDMpCgpmaWdfZDFkX2FkX2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2QxZF9hZF9zY29yZWRfYWRbWzFdXSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMyMSwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDcpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMyMSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDcpKSkKCmZpZ19kMWRfYWRfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWdfZDFkX2FkX3Bsb3RzLCBmaWdfZDFkX2FkX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4yKSkKCmZpZ19kMWRfYWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAxZDogQWR1bHRzIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kMWRfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDFkX2FkX3RpdGxlLCBmaWdfZDFkX2FkX3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxLjJ9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKcGxvdF9ncmlkKGZpZ19kMWFfYWRfcGxvdHNfbGVnX3RpdGxlLCAKICAgICAgICAgIGZpZ19kMWJfYWRfcGxvdHNfbGVnX3RpdGxlLCAKICAgICAgICAgIGZpZ19kMWNfYWRfcGxvdHNfbGVnX3RpdGxlLCBuY29sID0gMSkKYGBgCgpUaGUgdmlzdWFsaXphdGlvbnMgb2YgcmVsYXRpb25zaGlwcyBhbW9uZyBzY29yZXMgb24gdGhlc2UgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjYWxlcyBhcmUgcmVtYXJrYWJseSBzaW1pbGFyIGFjcm9zcyBTdHVkaWVzIDFhLTFjIChzZWUgRmlndXJlIDQueCwgcm93cyBBLUMpLgoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkZpcnN0IEkgd2lsbCBjb25zaWRlciB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQk9EWSBhbmQgSEVBUlQgKEZpZ3VyZSA0LngsIGxlZnRtb3N0IGNvbHVtbjogcGFuZWxzIEExLCBCMSwgYW5kIEMxKS4gVG8gbXkgZXllcywgdGhlIG1vc3Qgc3RyaWtpbmcgZmVhdHVyZXMgb2YgdGhlc2UgdmlzdWFsaXphdGlvbnMgYXJlIHRoYXQgKDEpIHRoZXJlIGlzIGEgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9IRUFSVF8gc2NhbGVzOyBhbmQgKDIpIHRoZXJlIGFyZSB2aXJ0dWFsbHkgbm8gZGF0YXBvaW50cyBhYm92ZSB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpLCBhbmQgY2VydGFpbmx5IG5vIGRhdGFwb2ludHMgaW4gdXBwZXIgbGVmdCBxdWFkcmFudCBvZiB0aGVzZSBwbG90cy4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgdGVuZGVkIHRvIGVuZG9yc2UgdGhlIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX0JPRFlfIHNjYWxlIGF0IGxlYXN0IGFzIHN0cm9uZ2x5LCBhbmQgb2Z0ZW4gbW9yZSBzdHJvbmdseSwgdGhhbiB0aGV5IGVuZG9yc2VkIGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBfSEVBUlRfIHNjYWxl4oCUaW4gb3RoZXIgd29yZHMsIHRoYXQgbWFueSBwYXJ0aWNpcGFudHMgYXR0cmlidXRlZCBtb3JlIEJPRFkgdGhhbiBIRUFSVCB0byB0aGUgdGFyZ2V0IGNoYXJhY3RlciBpbiBxdWVzdGlvbiwgYnV0IHZpcnR1YWxseSBubyBwYXJ0aWNpcGFudHMgYXR0cmlidXRlIG1vcmUgSEVBUlQgdGhhbiBCT0RZLiBUaGlzIGFzeW1tZXRyeSBhcHBlYXJzIHRvIGhhdmUgYmVlbiBkcml2ZW4gcHJpbWFyaWx5IGJ5IHBhcnRpY2lwYW50cycgYXNzZXNzbWVudHMgb2YgdGhlIGJlZXRsZSAoaW4gcmVkKTsgZm9yIHRoZSByb2JvdCAoaW4gYmx1ZSksIF9CT0RZXyBhbmQgX0hFQVJUXyBzY29yZXMgbWF5IGhhdmUgYmVlbiBtb3JlIHNpbWlsYXIgKGNsb3NlIHRvIHRoZSBkb3R0ZWQgbGluZSksIGFuZCB3ZXJlIGdlbmVyYWxseSBxdWl0ZSBsb3cuIAoKIyMjIyMgQk9EWSB2cy4gTUlORAoKTmV4dCBJIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJPRFkgYW5kIE1JTkQgKEZpZ3VyZSA0LngsIGNlbnRlciBjb2x1bW46IHBhbmVscyBBMiwgQjIsIGFuZCBDMikuIFNpbWlsYXIgdG8gdGhlIEJPRFkgdnMuIEhFQVJUIGNvbXBhcmlzb24sIHR3byBub3RhYmxlIGZlYXR1cmVzIG9mIHRoZXNlIHZpc3VhbGl6YXRpb25zIGFyZSB0aGF0ICgxKSB0aGVyZSBpcyBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzOyBhbmQgKDIpIHRoZXJlIGFyZSBmZXdlciBkYXRhcG9pbnRzIGJlbG93IHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkLCBkb3R0ZWQgZGlhZ29uYWwgbGluZSkgdGhhbiBhYm92ZSBpdCwgYW5kIG5vIGRhdGFwb2ludHMgaW4gbG93ZXIgcmlnaHQgcXVhZHJhbnQgb2YgdGhlc2UgcGxvdHMuIE1vc3QgcGFydGljaXBhbnRzIHRlbmRlZCB0byBlbmRvcnNlIHRoZSBtZW50YWwgY2FwYWNpdHkgaXRlbXMgaW5jbHVkZWQgaW4gdGhlIF9NSU5EXyBzY2FsZSByb3VnaGx5IGFzIHN0cm9uZ2x5LCBhbmQgc29tZXRpbWVzIG1vcmUgc3Ryb25nbHksIHRoYW4gdGhleSBlbmRvcnNlZCBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX0JPRFlfIHNjYWxlLCB3aGlsZSByZWxhdGl2ZWx5IGZldyBwYXJ0aWNwaWFudHMgZW5kb3JzZWQgX01JTkRfIGl0ZW1zIGxlc3Mgc3Ryb25nbHkgdGhhbiBfQk9EWV8gaXRlbXMgKHRob3VnaCB0aGlzIGFzeW1tZXRyeSBhcHBlYXJzIHRvIGhhdmUgYmVlbiBsZXNzIGV4dHJlbWUgdGhhbiB0aGUgYXN5bW1ldHJ5IGJldHdlZW4gX0JPRFlfIGFuZCBfSEVBUlRfIHNjb3JlcyBkb2N1bWVudGVkIGluIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGgpLiBJbiB0aGlzIGNhc2UsIHRoZSBhc3ltbWV0cnkgYmV0d2VlbiBfQk9EWV8gYW5kIF9NSU5EXyBhcHBlYXJzIHRvIGhhdmUgYmVlbiBkcml2ZW4gcHJpbWFyaWx5IGJ5IHBhcnRpY2lwYW50cycgYXNzZXNzbWVudHMgb2YgdGhlIHJvYm90IChpbiBibHVlKTsgZm9yIHRoZSBiZWV0bGUgKGluIHJlZCksIF9CT0RZXyBhbmQgX01JTkRfIHNjb3JlcyBhcHBlYXIgdG8gaGF2ZSBiZWVuIG1vcmUgc2ltaWxhciAoY2xvc2UgdG8gdGhlIGRvdHRlZCBsaW5lKS4gCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKRmluYWxseSBJIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEhFQVJUIGFuZCBNSU5EIChGaWd1cmUgNC54LCByaWdodG1vc3QgY29sdW1uOiBwYW5lbHMgQTMsIEIzLCBhbmQgQzMpLiBBZ2FpbiwgdHdvIGZlYXR1cmVzIG9mIHRoZXNlIHZpc3VhbGl6YXRpb25zIGFyZSBwYXJ0aWN1bGFybHkgc3RyaWtpbmc6ICgxKSBUaGVyZSBpcyBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX01JTkRfIGFuZCBfSEVBUlRfIHNjYWxlczsgYW5kICgyKSB0aGVyZSBhcmUgdmlydHVhbGx5IF9ub18gZGF0YXBvaW50cyBiZWxvdyB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpLiBUaGUgYXN5bW1ldHJ5IGJldHdlZW4gX01JTkRfIGFuZCBfSEVBUlRfIHNjb3JlcyBhcHBlYXJzIHRvIGhhdmUgYmVlbiBwYXJ0aWN1bGFybHkgZXh0cmVtZTogQWxtb3N0IF9hbGxfIHBhcnRpY2lwYW50cyBlbmRvcnNlZCB0aGUgbWVudGFsIGNhcGFjaXR5IGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBfTUlORF8gc2NhbGUgbW9yZSBzdHJvbmdseSB0aGFuIHRoZSBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX0hFQVJUXyBzY2FsZS4gSW4gdGhpcyBjYXNlLCB0aGlzIGFzeW1tZXRyeSBhcHBlYXJzIHRvIGJlIGJvcm4gb3V0IGZvciBib3RoIHRhcmdldCBjaGFyYWN0ZXJzLCBidXQgcGVyaGFwcyBtb3JlIGV4YWdnZXJhdGVkIGZvciB0aGUgYmVldGxlIChpbiByZWQpIHRoYW4gdGhlIHJvYm90IChpbiBibHVlKS4KCiMjIyMjIEludGVyaW0gZGlzY3Vzc2lvbgoKQWNyb3NzIFN0dWRpZXMgMWEtMWMsIGFsbCB0aHJlZSBvZiB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgY29uY2VwdHVhbCB1bml0cyBpZGVudGlmaWVkIGluIENoYXB0ZXIgSUlJIChCT0RZLCBIRUFSVCwgYW5kIE1JTkQpIGFwcGVhciB0byBiZSBjaGFyYWN0ZXJpemVkIGJ5IHR3byBmZWF0dXJlczogKDEpIFBvc2l0aXZlIHJlbGF0aW9uc2hpcHMsIHN1Y2ggdGhhdCB0aGUgbW9yZSBzdHJvbmdseSBhIHBhcnRpY2lwYW50IGVuZG9yc2VkIG9uZSBjb25jZXB0dWFsIHVuaXQsIHRoZSBtb3JlIHN0cm9uZ2x5IHRoZXkgdGVuZGVkIHRvIGVuZG9yc2UgdGhlIG90aGVyczsgYW5kICgyKSBSb2J1c3QgYXN5bW1ldHJpZXMgaW4gdGhlc2UgcG9zaXRpdmUgcmVsYXRpb25zaGlwcywgc3VjaCB0aGF0IHBhcnRpY2lwYW50cyB0ZW5kZWQgdG8gZW5kb3JzZSBNSU5EIG1vcmUgc3Ryb25nbHkgdGhhbiBCT0RZIG9yIEhFQVJULCBhbmQgSEVBUlQgbW9yZSBzdHJvbmdseSB0aGFuIE1JTkQuIFZpc3VhbCBpbnNwZWN0aW9uIHN1Z2dlc3RzIHRoYXQgdGhlc2UgYXN5bW1ldHJpZXMgd2VyZSBtb3N0IHByb25vdW5jZWQgZm9yIGNvbXBhcmlzb25zIGludm9sdmluZyBIRUFSVCwgd2l0aCB2aXJ0dWFsbHkgZXZlcnkgcGFydGljaXBhbnQgYWNyb3NzIGFsbCB0aHJlZSBvZiB0aGVzZSBzdHVkaWVzIGVuZG9yc2luZyBib3RoIEJPRFkgYW5kIE1JTkQgbW9yZSBzdHJvbmdseSB0aGFuIEhFQVJUIGZvciBib3RoIG9mIHRoZSAiZWRnZSBjYXNlIiBjaGFyYWN0ZXJzIGluY2x1ZGVkIGluIHRoZXNlIHN0dWRpZXMgKGEgYmVldGxlIGFuZCBhIHJvYm90KS4gCgpgYGB7cn0KZmlndXJlNC54IDwtIHBsb3RfZ3JpZChmaWdfZDFhX2FkX3Bsb3RzX2xlZ190aXRsZSwgZmlnX2QxYl9hZF9wbG90c19sZWdfdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgZmlnX2QxY19hZF9wbG90c19sZWdfdGl0bGUsIGZpZ19kMWRfYWRfcGxvdHNfbGVnX3RpdGxlLCAKICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDEsIDEsIDEuMTUpKQoKZmlndXJlNC54X2NhcCA8LSBhZGRfc3ViKGZpZ3VyZTQueCwgc3RyX3dyYXAoIkZpZ3VyZSA0Lng6IFJlbGF0aW9uc2hpcHMgYW1vbmcgVVMgYWR1bHRzJyBhdHRyaWJ1dGlvbnMgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkaWVzIDFhLTFkLCBvcmdhbml6ZWQgYnkgc3R1ZHkgKHJvd3MpIGFuZCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKGNvbHVtbnMpLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMS4gSW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYXJlIHBsb3R0ZWQgYXMgc21hbGwsIHRyYW5zbHVjZW50IGNpcmNsZXMsIGFuZCBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZC4iLCAxMTApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDEuOH0KZ2dkcmF3KGZpZ3VyZTQueF9jYXApCmBgYAoKIyMjIyBBbmFseXNpcyBvZiBhc3ltbWV0cmllcwoKSGVyZSBJIHByb3ZpZGUgYSBmb3JtYWwgYW5hbHlzaXMgb2YgdGhlIGFzeW1tZXRyaWVzIHJldmVhbGVkIGJ5IHRoZSB2aXN1YWxpemF0aW9ucyBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4gRm9yIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChCT0RZIHZzLiBIRUFSVCwgQk9EWSB2cy4gTUlORCwgYW5kIEhFQVJUIHZzLiBNSU5EKSwgSSB1c2VkIEJheWVzaWFuIHJlZ3Jlc3Npb24gdG8gY29tcGFyZSBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIHRoZXNlIHR3byBjb25jZXB0dWFsIHVuaXRzIHRvIHplcm8sIGNvbnRyb2xsaW5nIGZvciBkaWZmZXJlbmNlcyBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgdHdvICJlZGdlIGNhc2VzIiB0aGF0IHdlcmUgZmVhdHVyZWQgYXMgdGFyZ2V0IGNoYXJhY3RlcnMgaW4gdGhlc2Ugc3R1ZGllcyAoYSBiZWV0bGUgdnMgYSByb2JvdCksIGFuZCBpbmNsdWRpbmcgbWF4aW1hbCByYW5kb20gZWZmZWN0cyBzdHJ1Y3R1cmVzIChpbiB0aGlzIGNhc2UsIG5vIHJhbmRvbSBlZmZlY3RzIGZvciBTdHVkaWVzIDFhIGFuZCAxYiwgYW5kIHJhbmRvbSBpbnRlcmNlcHRzIGZvciBwYXJ0aWNpcGFudHMgaW4gU3R1ZHkgMWMpLiBTZWUgRmlndXJlIDQueCwgcGFuZWxzIEEtQyBmb3IgdmlzdWFsIGRlcGljdGlvbnMgb2YgdGhlc2UgZGlmZmVyZW5jZSBzY29yZXMuCgpgYGB7cn0KZDFhX2FkX3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfZnVuKGQxYV9hZF9zY29yZWRfYWQpCmNvbnRyYXN0cyhkMWFfYWRfc2NvcmVkX2FkX2RpZmYkY2hhcmFjdGVyKSA8LSBjb250cmFzdHNfc3VtX2VkZ2UKCnNhdmVSRFMoZDFhX2FkX3Njb3JlZF9hZF9kaWZmLCAiLi9zdG9yZWQvZGlmZnNjb3JlX2RhdGEvZDFhX2FkX3Njb3JlZF9hZF9kaWZmIikKYGBgCgpgYGB7cn0KcGxvdF9kMWFfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZnBsb3RfZnVuKGQxYV9hZF9zY29yZWRfYWRfZGlmZikKYGBgCgpgYGB7cn0KIyByX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQxYV9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwgCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpyX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkMWFfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELCAKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKcl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpzdW1tYXJ5KHJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQxYV9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCwgCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpyX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFhX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKc3VtbWFyeShyX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKQpgYGAKCmBgYHtyfQpyZWd0YWJfZDFhX2FkX3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfcmVnX3RhYmxlX2Z1bigKICByZWdfbGlzdCA9IGxpc3Qocl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKICAgICAgICAgICAgICAgICAgcl9kMWFfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAogICAgICAgICAgICAgICAgICByX2QxYV9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKSwKICBwYWlyX2xpc3QgPSBjKCJCT0RZIC0gSEVBUlQiLCAiQk9EWSAtIE1JTkQiLCAiSEVBUlQgLSBNSU5EIiksCiAgc3R1ZHlfbmFtZSA9ICJTdHVkeSAxYSIsCiAgY2hhcl9sYWJlbCA9ICJSb2JvdCB2cy4gR00iKQpgYGAKCgpgYGB7cn0KZDFiX2FkX3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfZnVuKGQxYl9hZF9zY29yZWRfYWQpCmNvbnRyYXN0cyhkMWJfYWRfc2NvcmVkX2FkX2RpZmYkY2hhcmFjdGVyKSA8LSBjb250cmFzdHNfc3VtX2VkZ2UKCnNhdmVSRFMoZDFiX2FkX3Njb3JlZF9hZF9kaWZmLCAiLi9zdG9yZWQvZGlmZnNjb3JlX2RhdGEvZDFiX2FkX3Njb3JlZF9hZF9kaWZmIikKYGBgCgpgYGB7cn0KcGxvdF9kMWJfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZnBsb3RfZnVuKGQxYl9hZF9zY29yZWRfYWRfZGlmZikKYGBgCgpgYGB7cn0KIyByX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQxYl9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpzdW1tYXJ5KHJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQxYl9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKc3VtbWFyeShyX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkMWJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpyX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFiX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKc3VtbWFyeShyX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKQpgYGAKCmBgYHtyfQpyZWd0YWJfZDFiX2FkX3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfcmVnX3RhYmxlX2Z1bigKICByZWdfbGlzdCA9IGxpc3Qocl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKICAgICAgICAgICAgICAgICAgcl9kMWJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAogICAgICAgICAgICAgICAgICByX2QxYl9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKSwKICBwYWlyX2xpc3QgPSBjKCJCT0RZIC0gSEVBUlQiLCAiQk9EWSAtIE1JTkQiLCAiSEVBUlQgLSBNSU5EIiksCiAgc3R1ZHlfbmFtZSA9ICJTdHVkeSAxYiIsCiAgY2hhcl9sYWJlbCA9ICJSb2JvdCB2cy4gR00iKQpgYGAKCgpgYGB7cn0KZDFjX2FkX3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfZnVuKGQxY19hZF9zY29yZWRfYWQpCmNvbnRyYXN0cyhkMWNfYWRfc2NvcmVkX2FkX2RpZmYkY2hhcmFjdGVyKSA8LSBjb250cmFzdHNfc3VtX2VkZ2UKCnNhdmVSRFMoZDFjX2FkX3Njb3JlZF9hZF9kaWZmLCAiLi9zdG9yZWQvZGlmZnNjb3JlX2RhdGEvZDFjX2FkX3Njb3JlZF9hZF9kaWZmIikKYGBgCgpgYGB7cn0KcGxvdF9kMWNfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZnBsb3RfZnVuKGQxY19hZF9zY29yZWRfYWRfZGlmZikKYGBgCgpgYGB7cn0KIyByX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDFjX2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKcl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnN1bW1hcnkocl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkMWNfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpyX2QxY19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnN1bW1hcnkocl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkMWNfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpyX2QxY19hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFjX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKc3VtbWFyeShyX2QxY19hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKQpgYGAKCmBgYHtyfQpyZWd0YWJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfcmVnX3RhYmxlX2Z1bigKICByZWdfbGlzdCA9IGxpc3Qocl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKICAgICAgICAgICAgICAgICAgcl9kMWNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAogICAgICAgICAgICAgICAgICByX2QxY19hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKSwKICBwYWlyX2xpc3QgPSBjKCJCT0RZIC0gSEVBUlQiLCAiQk9EWSAtIE1JTkQiLCAiSEVBUlQgLSBNSU5EIiksCiAgc3R1ZHlfbmFtZSA9ICJTdHVkeSAxYyIsCiAgY2hhcl9sYWJlbCA9ICJSb2JvdCB2cy4gR00iKQpgYGAKCmBgYHtyfQpkMWRfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9mdW4oZDFkX2FkX3Njb3JlZF9hZCkKY29udHJhc3RzKGQxZF9hZF9zY29yZWRfYWRfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZHYyMQoKc2F2ZVJEUyhkMWRfYWRfc2NvcmVkX2FkX2RpZmYsICIuL3N0b3JlZC9kaWZmc2NvcmVfZGF0YS9kMWRfYWRfc2NvcmVkX2FkX2RpZmYiKQpgYGAKCmBgYHtyfQpwbG90X2QxZF9hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDFkX2FkX3Njb3JlZF9hZF9kaWZmLCBjb2xvcnMgPSBjb2xvcnMyMSkKYGBgCgpgYGB7cn0KIyBkMWQgcmVncmVzc2lvbnMgZG9uZSBiZWxvdwpgYGAKCmBgYHtyfQpyZWd0YWJfc3R1ZHkxYWJjIDwtIHJlZ3RhYl9kMWFfYWRfc2NvcmVkX2FkX2RpZmYgJT4lCiAgZnVsbF9qb2luKHJlZ3RhYl9kMWJfYWRfc2NvcmVkX2FkX2RpZmYpICU+JQogIGZ1bGxfam9pbihyZWd0YWJfZDFjX2FkX3Njb3JlZF9hZF9kaWZmKSAlPiUKICBtdXRhdGVfYXQodmFycyhiLCBzLmUuKSwKICAgICAgICAgICAgZnVucyhmb3JtYXQocm91bmQoLiwgZGlnaXRzID0gMiksIG5zbWFsbCA9IDIpKSkgJT4lCiAgdW5pdGUocmVzdWx0LCBiLCBzLmUuLCBDSTk1LCBub256ZXJvKSAlPiUKICBzcHJlYWQoc3R1ZHksIHJlc3VsdCkgJT4lCiAgc2VwYXJhdGUoYFN0dWR5IDFhYCwgYygiczFhX2IiLCAiczFhX3MuZS4iLCAiczFhXzk1JSBDSSIsICJzMWFfbnoiKSwgc2VwID0gIl8iKSAlPiUKICBzZXBhcmF0ZShgU3R1ZHkgMWJgLCBjKCJzMWJfYiIsICJzMWJfcy5lLiIsICJzMWJfOTUlIENJIiwgInMxYl9ueiIpLCBzZXAgPSAiXyIpICU+JQogIHNlcGFyYXRlKGBTdHVkeSAxY2AsIGMoInMxY19iIiwgInMxY19zLmUuIiwgInMxY185NSUgQ0kiLCAiczFjX256IiksIHNlcCA9ICJfIikKYGBgCgpgYGB7cn0KIyBpbnRlcmltIHRhYmxlIGZvciBlYXNlIG9mIHdyaXRpbmcKcmVndGFiX3N0dWR5MWFiYyAlPiUKICBzZWxlY3QoLWVuZHNfd2l0aCgicy5lLiIpKSAlPiUKICBmaWx0ZXIocGFyYW0gPT0gIkludGVyY2VwdCIpICU+JQogIGthYmxlKGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCnBsb3RfZ3JpZChwbG90X2QxYV9hZF9zY29yZWRfYWRfZGlmZiwgCiAgICAgICAgICBwbG90X2QxYl9hZF9zY29yZWRfYWRfZGlmZiwgCiAgICAgICAgICBwbG90X2QxY19hZF9zY29yZWRfYWRfZGlmZiwKICAgICAgICAgIG5jb2wgPSAzKQpgYGAKCiMjIyMjIEJPRFkgdnMuIEhFQVJUCgpUaGVzZSByZWdyZXNzaW9uIGFuYWx5c2VzIGNvbmZpcm1lZCB0aGF0LCBhY3Jvc3MgU3R1ZGllcyAxYS0xYywgZGlmZmVyZW5jZSBzY29yZXMgY29tcGFyaW5nIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfQk9EWV8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9IRUFSVF8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KS4gQXMgSSBzcGVjdWxhdGVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCBpbiBhbGwgc3R1ZGllcyB0aGlzIGRpZmZlcmVuY2Ugd2FzIGRyaXZlbiBieSBwYXJ0aWNpcGFudHMnIGFzc2Vzc21lbnRzIG9mIHRoZSBiZWV0bGU7IGluIHRoZSBhZ2dyZWdhdGUsIGRpZmZlcmVuY2Ugc2NvcmVzIHdlcmUgcmVkdWNlZCB0byAwIGZvciB0aGUgcm9ib3QgKHNlZSB0aGUgIlRhcmdldCBjaGFyYWN0ZXIiIHJvdyBmb3IgdGhlICJCT0RZLUhFQVJUIiBjb21wYXJpc29uIGluIFRhYmxlIDQueCkuICAKCiMjIyMjIEJPRFkgdnMuIE1JTkQKClRoZXNlIHJlZ3Jlc3Npb24gYW5hbHlzZXMgY29uZmlybWVkIHRoYXQsIGFjcm9zcyBTdHVkaWVzIDFhLTFjLCBkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9NSU5EXyBzY2FsZXMgd2VyZSBzdWJzdGFudGlhbGx5IG5vbi16ZXJvLCBpbiB0aGUgZGlyZWN0aW9uIG9mIHBhcnRpY2lwYW50cyBlbmRvcnNpbmcgX01JTkRfIGl0ZW1zIG1vcmUgc3Ryb25nbHkgdGhhbiBfQk9EWV8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLiBJbiBhbGwgc3R1ZGllcyB0aGlzIGRpZmZlcmVuY2Ugd2FzIGRyaXZlbiBieSBwYXJ0aWNpcGFudHMnIGFzc2Vzc21lbnRzIG9mIHRoZSByb2JvdDsgaW4gdGhlIGFnZ3JlZ2F0ZSwgZGlmZmVyZW5jZSBzY29yZXMgd2VyZSByZWR1Y2VkIHRvIDAgZm9yIHRoZSBiZWV0bGUgKHNlZSB0aGUgIlRhcmdldCBjaGFyYWN0ZXIiIHJvdyBmb3IgdGhlICJCT0RZLU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KS4KCiMjIyMjIEhFQVJUIHZzLiBNSU5ECgpUaGVzZSByZWdyZXNzaW9uIGFuYWx5c2VzIGNvbmZpcm1lZCB0aGF0LCBhY3Jvc3MgU3R1ZGllcyAxYS0xYywgZGlmZmVyZW5jZSBzY29yZXMgY29tcGFyaW5nIHNjb3JlcyBvbiB0aGUgX0hFQVJUXyBhbmQgX01JTkRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9IRUFSVF8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KS4gSW4gYWxsIHN0dWRpZXMgdGhpcyBkaWZmZXJlbmNlIHdhcyBzb21ld2hhdCBleGFnZ2VyYXRlZCBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgcm9ib3QsIHJlbGF0aXZlIHRvIHRoZSBiZWV0bGUgKHNlZSB0aGUgIlRhcmdldCBjaGFyYWN0ZXIiIHJvdyBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQueCkuCgojIyMjIyBJbnRlcmltIGRpc2N1c3Npb24KClRoZXNlIGZvcm1hbCBhbmFseXNlcyBvZiBkaWZmZXJlbmNlIHNjb3JlcyBhY3Jvc3MgdGhlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgaW4gU3R1ZGllcyAxYS0xYyBjb25maXJtIG15IGluZm9ybWF0aW9uIG9ic2VydmF0aW9ucyBvZiBhc3ltbWV0cmllcyBkZXNjcmliZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb246IEFjcm9zcyBzdHVkaWVzLCBwYXJ0aWNpcGFudHMgdGVuZGVkIHRvIGVuZG9yc2UgTUlORCBtb3JlIHN0cm9uZ2x5IHRoYW4gQk9EWSBvciBIRUFSVCwgYW5kIEJPRFkgbW9yZSBzdHJvbmdseSB0aGFuIEhFQVJULgoKYGBge3J9CmZpZ3VyZTQueF9wbG90czEyMyA8LSBwbG90X2dyaWQocGxvdF9kMWFfYWRfc2NvcmVkX2FkX2RpZmYgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYnModGl0bGUgPSAiU3R1ZHkgMWE6IEFkdWx0cyIpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RfZDFiX2FkX3Njb3JlZF9hZF9kaWZmICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDFiOiBBZHVsdHMiKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RfZDFjX2FkX3Njb3JlZF9hZF9kaWZmICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDFjOiBBZHVsdHMiKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMywgcmVsX3dpZHRocyA9IGMoMSwgMSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gIkFVVE8iKQoKZmlndXJlNC54X3Bsb3RzMTIzX2xlZyA8LSBwbG90X2dyaWQoZmlndXJlNC54X3Bsb3RzMTIzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbGVnZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RfZDFhX2FkX3Njb3JlZF9hZF9kaWZmICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4xKSkKCmZpZ3VyZTQueF9wbG90czQgPC0gcGxvdF9ncmlkKHBsb3RfZDFkX2FkX3Njb3JlZF9hZF9kaWZmICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDFkOiBBZHVsdHMiKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gIkQiKQoKZmlndXJlNC54X3Bsb3RzNF9sZWcgPC0gcGxvdF9ncmlkKGZpZ3VyZTQueF9wbG90czQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbGVnZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90X2QxZF9hZF9zY29yZWRfYWRfZGlmZiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4yKSkKCmZpZ3VyZTQueF9wbG90cyA8LSBwbG90X2dyaWQoZmlndXJlNC54X3Bsb3RzMTIzX2xlZywgZmlndXJlNC54X3Bsb3RzNF9sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAxLjEpKQoKZmlndXJlNC54X2NhcCA8LSBhZGRfc3ViKGZpZ3VyZTQueF9wbG90cywgc3RyX3dyYXAoIkZpZ3VyZSA0Lng6IERpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gVVMgYWR1bHRzJyBhdHRyaWJ1dGlvbnMgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkaWVzIDFhLTFkLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMSwgc3VjaCB0aGF0IGRpZmZlcmVuY2Ugc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gLTEgdG8gKzEuIEluZGl2aWR1YWwgcGFydGljaXBhbnRzIGFyZSBwbG90dGVkIGFzIHNtYWxsLCB0cmFuc2x1Y2VudCBjaXJjbGVzLCBhbmQgbWVhbiBkaWZmZXJlbmNlIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZCAoaS5lLiwgYSBkaWZmZXJlbmNlIHNjb3JlIG9mIDApLiIsIDE0MCksIHggPSAwLCBoanVzdCA9IDApCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC44fQpnZ2RyYXcoZmlndXJlNC54X2NhcCkKYGBgCgpgYGB7cn0KdGFibGU0LnggPC0gcmVndGFiX3N0dWR5MWFiYyAlPiUKICBzZWxlY3QoLXBhaXIsIC1lbmRzX3dpdGgoIl9zLmUuIikpICU+JQogIHJlbmFtZShQYXJhbWV0ZXIgPSBwYXJhbSkgJT4lCiAgcmVuYW1lX2FsbChmdW5zKGdzdWIoIm56IiwgIiAiLCAuKSkpICU+JQogIHJlbmFtZV9hbGwoZnVucyhnc3ViKCJzMS5fIiwgIiIsIC4pKSkgJT4lCiAga2FibGUoZm9ybWF0ID0gImh0bWwiLCBhbGlnbiA9IGMoImwiLCByZXAoYyhyZXAoInIiLCAyKSwgImwiKSwgMykpLCAKICAgICAgICBjYXB0aW9uID0gIlRhYmxlIDQueDogUmVncmVzc2lvbiBhbmFseXNlcyBvZiBkaWZmZXJlbmNlIHNjb3JlcyBmb3IgVVMgYWR1bHRzIGluIFN0dWRpZXMgMWEtMWMuIFRoZSB0YWJsZSBwcmVzZW50cyByZXN1bHRzIGZyb20gc2VwYXJhdGUgQmF5ZXNpYW4gcmVncmVzc2lvbnMgb2YgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKEJPRFkgdnMuIEhFQVJULCBCT0RZIHZzLiBNSU5ELCBhbmQgSEVBUlQgdnMuIE1JTkQpLiBFYWNoIHJlZ3Jlc3Npb24gaW5jbHVkZWQgdHdvIGZpeGVkIGVmZmVjdCBwYXJhbWV0ZXJzOiAoMSkgdGhlIGludGVyY2VwdCwgd2hpY2ggSSB0cmVhdCBhcyBhbiBpbmRleCBvZiB0aGUgYXN5bW1ldHJ5IGluIGF0dHJpYnV0aW9ucyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgaW4gcXVlc3Rpb247IGFuZCAoMikgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMsIHJlcG9ydGVkIGhlcmUgYXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJvYm90IGFuZCB0aGUgZ3JhbmQgbWVhbiAoR00pLiBJbnRlcmNlcHRzIGFyZSBoaWdobGlnaHRlZCBpbiBib2xkLCBiZWNhdXNlIHRoZXNlIGFyZSB0aGUgcHJpbWFyeSBwYXJhbWV0ZXJzIG9mIGludGVyZXN0IGZvciB0aGVzZSBhbmFseXNlcy4gRm9yIGVhY2ggcGFyYW1ldGVyLCB0aGUgdGFibGUgaW5jbHVkZXMgdGhlIGVzdGltYXRlIChiKSBhbmQgYSA5NSUgY3JlZGlibGUgaW50ZXJ2YWwgZm9yIHRoYXQgZXN0aW1hdGUuIEFzdGVyaXNrcyBpbmRpY2F0ZSA5NSUgY3JlZGlibGUgaW50ZXJ2YWxzIHRoYXQgZG8gbm90IGluY2x1ZGUgMC4iKSAlPiUgIAogIGthYmxlX3N0eWxpbmcoKSAlPiUKICByb3dfc3BlYyhjKDEsIDMsIDUpLCBib2xkID0gVCkgJT4lCiAgZ3JvdXBfcm93cygiQk9EWSAtIEhFQVJUIiwgMSwgMikgJT4lCiAgZ3JvdXBfcm93cygiQk9EWSAtIE1JTkQiLCAzLCA0KSAlPiUKICBncm91cF9yb3dzKCJIRUFSVCAtIE1JTkQiLCA1LCA2KSAlPiUKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMSwKICAgICAgICAgICAgICAgICAgICAgIlN0dWR5IDFhIiA9IDMsCiAgICAgICAgICAgICAgICAgICAgICJTdHVkeSAxYiIgPSAzLAogICAgICAgICAgICAgICAgICAgICAiU3R1ZHkgMWMiID0gMykpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQp0YWJsZTQueApgYGAKCiMjIyBTdHVkeSAxZAoKIyMjIyBTY2FsZSBjb25zdHJ1Y3Rpb24KCmBgYHtyfQojIGRvbmUgYWJvdmUKYGBgCgpGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiAiR2VuZXJhbCBhbmFseXNpcyBwbGFuLCIgYWJvdmUsIHlpZWxkZWQgYHIgZmFjdF9uYW1lX2Z1bihmYWN0b3JfbmFtZXNfZWZhX3dkbV9kMWRfYWQpYCBzY2FsZXMgb2YgYHIgc2NhbGVzX2VmYV93ZG1fZDFkX2FkICU+JSBjb3VudChmYWN0b3IpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4obikpICU+JSBzZWxlY3QobWVhbikgJT4lIGFzLm51bWVyaWMoKWAgaXRlbXMgZWFjaCwgd2l0aCBhIGxhcmdlIGRlZ3JlZSBvZiBvdmVybGFwIGluIGl0ZW1zIGJldHdlZW4gdGhlc2Ugc2NhbGVzIGFuZCB0aGUgc2NhbGVzIGRlcml2ZWQgZnJvbSBTdHVkaWVzIDFhLTFjOyBzZWUgVGFibGUgNC54LgoKIyMjIyBWaXN1YWxpemF0aW9uCgpgYGB7cn0KIyBkb25lIGFib3ZlCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjQ1fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCmZpZ19kMWRfYWRfcGxvdHNfbGVnX3RpdGxlCmBgYAoKVmlzdWFsaXphdGlvbnMgb2YgcmVsYXRpb25zaGlwcyBhbW9uZyBzY29yZXMgb24gdGhlc2UgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjYWxlcyBhcmUgcHJvdmlkZWQgaW4gRmlndXJlIDQueCwgcm93IEQuCgojIyMjIyBCT0RZIHZzLiBIRUFSVAoKRmlyc3QgSSB3aWxsIGNvbnNpZGVyIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBCT0RZIGFuZCBIRUFSVCAoRmlndXJlIDQueCwgcGFuZWwgRDEpLiBNdWNoIGFzIGluIFN0dWRpZXMgMWEtMWMgKHJvd3MgQS1DKSwgdGhlIG1vc3Qgc3RyaWtpbmcgZmVhdHVyZXMgb2YgdGhpcyB2aXN1YWxpemF0aW9uIGFyZSB0aGF0ICgxKSB0aGVyZSBpcyBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlczsgYW5kICgyKSB0aGVyZSBhcmUgdmlydHVhbGx5IG5vIGRhdGFwb2ludHMgYWJvdmUgdGhlIGxpbmUgb2YgZXF1aXZhbGVuY2UgKCR5ID0geCQsIGRvdHRlZCBkaWFnb25hbCBsaW5lKSwgYW5kIGNlcnRhaW5seSBubyBkYXRhcG9pbnRzIGluIHVwcGVyIGxlZnQgcXVhZHJhbnQuIEluZGl2aWR1YWwgcGFydGljaXBhbnRzIHRlbmRlZCB0byBlbmRvcnNlIHRoZSBtZW50YWwgY2FwYWNpdHkgaXRlbXMgaW5jbHVkZWQgaW4gdGhlIF9CT0RZXyBzY2FsZSBhdCBsZWFzdCBhcyBzdHJvbmdseSwgYW5kIG9mdGVuIG1vcmUgc3Ryb25nbHksIHRoYW4gdGhleSBlbmRvcnNlZCBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX0hFQVJUXyBzY2FsZeKAlGluIG90aGVyIHdvcmRzLCBtYW55IHBhcnRpY2lwYW50cyBhdHRyaWJ1dGVkIG1vcmUgQk9EWSB0aGFuIEhFQVJUIHRvIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGluIHF1ZXN0aW9uLCBidXQgdmlydHVhbGx5IG5vIHBhcnRpY2lwYW50cyBhdHRyaWJ1dGVkIG1vcmUgSEVBUlQgdGhhbiBCT0RZLiAKCkFuIGFuYWx5c2lzIG9mIG1lYW4gc2NvcmVzIGJ5IHRhcmdldCBjaGFyYWN0ZXIgZnVydGhlciByZXZlYWxzIHRoYXQsIGluIHRoZSBhZ2dyZWdhdGUsIGNoYXJhY3RlcnMgdGhhdCByZWNlaXZlZCByZWxhdGl2ZWx5IGxvdyBfQk9EWV8gc2NvcmVzIChlLmcuLCBpbmVydCBvYmplY3RzLCB0ZWNobm9sb2dpZXMsIHRoZSBmZXR1cywgdGhlIHBlcnNvbiBpbiBhIHBlcnNpc3RhbnQgdmVnZXRhdGl2ZSBzdGF0ZSwgYW5kIHN1Y2ggImxvd2VyIiBsaWZlZm9ybXMgYXMgYSBtaWNyb2JlKSByZWNlaXZlZCB1bml2ZXJzYWxseSBsb3cgbWVhbiBfSEVBUlRfIHNjb3Jlcywgd2hpbGUgY2hhcmFjdGVycyB0aGF0IHJlY2VpdmVkIHJlbGF0aXZlbHkgaGlnaCBfQk9EWV8gc2NvcmVzIChlLmcuLCAiaGlnaGVyIiBsaWZlZm9ybXMgbGlrZSBhbmltYWxzIGFuZCB0eXBpY2FsIGh1bWFucykgdmFyaWVkIGluIHRoZWlyIG1lYW4gX0hFQVJUXyBzY29yZXMuIFRoaXMgcmFpc2VzIHRoZSBpbnRyaWd1aW5nIHBvc3NpYmlsaXR5IHRoYXQgYXR0cmlidXRpb25zIG9mIEJPRFkgYW5kIEhFQVJUIG1heSBoYXZlIGJlZW4gZ292ZXJlZCBieSBzb21lIHNvcnQgb2YgInRocmVzaG9sZCIgbW9kZWwsIGluIHdoaWNoIGF0dHJpYnV0aW9ucyBvZiBhbnkgc3Vic3RhbnRpYWwgYW1vdW50IG9mIEhFQVJUIGRlcGVuZCBvbiB0aGUgdGFyZ2V0IGNoYXJhY3RlciBoYXZpbmcgYSBjZXJ0YWluIGRlZ3JlZSBvZiBCT0RZLiAoVGhpcyB3aWxsIG5vdCBiZSBleHBsb3JlZCBmdXJ0aGVyIGluIHRoZSBjdXJyZW50IGRpc3NlcnRhdGlvbi4pCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpOZXh0IEkgd2lsbCBjb25zaWRlciB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQk9EWSBhbmQgTUlORCAoRmlndXJlIDQueCwgcGFuZWwgRDIpLiBBcyBpbiBTdHVkaWVzIDFhLTFjLCB0d28gbm90YWJsZSBmZWF0dXJlcyBvZiB0aGlzIHZpc3VhbGl6YXRpb24gYXJlIHRoYXQgKDEpIHRoZXJlIGlzIGEgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9NSU5EXyBzY2FsZXM7IGFuZCAoMikgdGhlcmUgYXJlIGRhdGFwb2ludHMgaW4gdGhlIHVwcGVyIGxlZnQgYnV0IG5vdCB0aGUgbG93ZXIgcmlnaHQgcXVhZHJhbnRzLiBIb3dldmVyLCB3aGlsZSBwYXJ0aWNpcGFudHMgd2hvIGFzc2Vzc2VkIGNlcnRhaW4gdGFyZ2V0IGNoYXJhY3RlcnMgKG5hbWVseSwgdGhlIHRlY2hub2xvZ2llcykgdGVuZGVkIHRvIGVuZG9yc2UgdGhlIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX01JTkRfIHNjYWxlIHJvdWdobHkgYXMgc3Ryb25nbHksIGFuZCBzb21ldGltZXMgbW9yZSBzdHJvbmdseSwgdGhhbiB0aGV5IGVuZG9yc2VkIGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBfQk9EWV8gc2NhbGUsIHBhcnRpY2lwYW50cyB3aG8gYXNzc2Vzc2VkIG90aGVyIHRhcmdldCBjaGFyYWN0ZXJzLCBpZiBhbnl0aGluZywgYXBwZWFyIHRvIGhhdmUgc2hvd24gdGhlIHJldmVyc2UgcGF0dGVybiwgZW5kb3JzaW5nIF9NSU5EXyBpdGVtcyBzbGlnaHRseSBsZXNzIHN0cm9uZ2x5IHRoYW4gX0JPRFlfIGl0ZW1zLiBJbiBvdGhlciB3b3JkcywgdGhlcmUgYXBwZWFycyB0byBiZSBhIGxlc3MgY29uc2lzdGVuY3kgaW4gdGhlICJhc3ltbWV0cnkiIGJldHdlbiBCT0RZIGFuZCBNSU5EIGluIFN0dWR5IDFkIHRoYW4gdGhlcmUgd2FzIGluIFN0dWRpZXMgMWEtMWMuCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKRmluYWxseSBJIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEhFQVJUIGFuZCBNSU5EIChGaWd1cmUgNC54LCBwYW5lbCBEMSkuIE11Y2ggYXMgaW4gU3R1ZGllcyAxYS0xYyAocm93cyBBLUMpLCB0aGUgbW9zdCBzdHJpa2luZyBmZWF0dXJlcyBvZiB0aGlzIHZpc3VhbGl6YXRpb24gYXJlIHRoYXQgKDEpIHRoZXJlIGlzIGEgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfSEVBUlRfIGFuZCBfTUlORF8gc2NhbGVzOyBhbmQgKDIpIHRoZXJlIGFyZSB2aXJ0dWFsbHkgbm8gZGF0YXBvaW50cyBiZWxvdyB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpLCBhbmQgY2VydGFpbmx5IG5vIGRhdGFwb2ludHMgaW4gbG93ZXIgcmlnaHQgcXVhZHJhbnQuIEluZGl2aWR1YWwgcGFydGljaXBhbnRzIHRlbmRlZCB0byBlbmRvcnNlIHRoZSBtZW50YWwgY2FwYWNpdHkgaXRlbXMgaW5jbHVkZWQgaW4gdGhlIF9NSU5EXyBzY2FsZSBhdCBsZWFzdCBhcyBzdHJvbmdseSwgYW5kIG9mdGVuIG1vcmUgc3Ryb25nbHksIHRoYW4gdGhleSBlbmRvcnNlZCBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX0hFQVJUXyBzY2FsZeKAlGluIG90aGVyIHdvcmRzLCBtYW55IHBhcnRpY2lwYW50cyBhdHRyaWJ1dGVkIG1vcmUgTUlORCB0aGFuIEhFQVJUIHRvIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGluIHF1ZXN0aW9uLCBidXQgdmlydHVhbGx5IG5vIHBhcnRpY2lwYW50cyBhdHRyaWJ1dGVkIG1vcmUgSEVBUlQgdGhhbiBNSU5ELiAKCkFuIGFuYWx5c2lzIG9mIG1lYW4gc2NvcmVzIGJ5IHRhcmdldCBjaGFyYWN0ZXIgZnVydGhlciByZXZlYWxzIHRoYXQsIGluIHRoZSBhZ2dyZWdhdGUsIGNoYXJhY3RlcnMgdGhhdCByZWNlaXZlZCByZWxhdGl2ZWx5IGxvdyBfTUlORF8gc2NvcmVzIChlLmcuLCBpbmVydCBvYmplY3RzLCB0aGUgZmV0dXMsIGFuZCBzdWNoICJsb3dlciIgbGlmZWZvcm1zIGFzIGEgbWljcm9iZSkgcmVjZWl2ZWQgdW5pdmVyc2FsbHkgbG93IG1lYW4gX0hFQVJUXyBzY29yZXMsIHdoaWxlIGNoYXJhY3RlcnMgdGhhdCByZWNlaXZlZCByZWxhdGl2ZWx5IGhpZ2ggX01JTkRfIHNjb3JlcyAoZS5nLiwgbW9yZSBzb3BoaXN0aWNhdGVkIHRlY2hub2xvZ2llcyBhcyB3ZWxsIGFzICJoaWdoZXIiIGxpZmVmb3JtcyBsaWtlIGFuaW1hbHMgYW5kIHR5cGljYWwgaHVtYW5zKSB2YXJpZWQgaW4gdGhlaXIgbWVhbiBfSEVBUlRfIHNjb3Jlcy4gQXMgaW4gdGhlIEJPRFkgdnMuIEhFQVJUIGNvbXBhcmlzb24gZGlzY3Vzc2VkIGVhcmxpZXIsIHRoaXMgcmFpc2VzIHRoZSBpbnRyaWd1aW5nIHBvc3NpYmlsaXR5IHRoYXQgYXR0cmlidXRpb25zIG9mIEhFQVJUIGFuZCBNSU5EIG1heSBoYXZlIGJlZW4gZ292ZXJlZCBieSBzb21lIHNvcnQgb2YgInRocmVzaG9sZCIgbW9kZWwsIGluIHdoaWNoIGF0dHJpYnV0aW9ucyBvZiBhbnkgc3Vic3RhbnRpYWwgYW1vdW50IG9mIEhFQVJUIGRlcGVuZCBvbiB0aGUgdGFyZ2V0IGNoYXJhY3RlciBoYXZpbmcgYSBjZXJ0YWluIGRlZ3JlZSBvZiBNSU5ELiAoQWdhaW4sIHRoaXMgd2lsbCBub3QgYmUgZXhwbG9yZWQgZnVydGhlciBpbiB0aGUgY3VycmVudCBkaXNzZXJ0YXRpb24uKQoKIyMjIyMgSW50ZXJpbSBkaXNjdXNzaW9uCgpJbiBTdHVkeSAxZCwgbWFueSBvZiB0aGUgb2JzZXJ2YXRpb25zIGRlc2NyaWJlZCBmb3IgU3R1ZGllcyAxYS0xYyB3ZXJlIHVwaGVsZC4gSW4gcGFydGljdWxhciwgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBCT0RZIHZzLiBIRUFSVCBhbmQgYmV0d2VlbiBNSU5EIHZzLiBIRUFSVCBhcHBlYXIgdG8gYmUgY2hhcmFjdGVyaXplZCBieSB0d28gZmVhdHVyZXM6ICgxKSBQb3NpdGl2ZSByZWxhdGlvbnNoaXBzLCBzdWNoIHRoYXQgdGhlIG1vcmUgc3Ryb25nbHkgYSBwYXJ0aWNpcGFudCBlbmRvcnNlZCBvbmUgY29uY2VwdHVhbCB1bml0LCB0aGUgbW9yZSBzdHJvbmdseSB0aGV5IHRlbmRlZCB0byBlbmRvcnNlIHRoZSBvdGhlcjsgYW5kICgyKSBSb2J1c3QgYXN5bW1ldHJpZXMgaW4gdGhlc2UgcG9zaXRpdmUgcmVsYXRpb25zaGlwcywgc3VjaCB0aGF0IHBhcnRpY2lwYW50cyB0ZW5kZWQgdG8gZW5kb3JzZSBlaXRoZXIgQk9EWSBvciBNSU5EIG1vcmUgc3Ryb25nbHkgdGhhbiBIRUFSVC4gSG93ZXZlciwgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJPRFkgdnMuIE1JTkQgYXBwZWFycyB0byBiZSBtb3JlIHZhcmlhYmxlIGFjcm9zcyBwYXJ0aWNpcGFudHMgYW5kIGFjcm9zcyB0YXJnZXQgY2hhcmFjdGVycyB0aGFuIHRoZSBnZW5lcmFsbHkgYXN5bW1ldHJpY2FsIHJlbGF0aW9uc2hpcCAod2l0aCBwYXJ0aWNpcGFudHMgdGVuZGluZyB0byBhdHRyaWJ1dGUgbW9yZSBNSU5EIHRoYW4gQk9EWSkgdGhhdCBlbWVyZ2VkIGluIFN0dWRpZXMgMWEtMWMuCgojIyMjIEFuYWx5c2lzIG9mIGFzeW1tZXRyaWVzCgpIZXJlIEkgcHJvdmlkZSBhIGZvcm1hbCBhbmFseXNpcyBvZiB0aGUgYXN5bW1ldHJpZXMgcmV2ZWFsZWQgYnkgdGhlIHZpc3VhbGl6YXRpb25zIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLiBBcyBpbiBTdHVkaWVzIDFhLTFjLCBmb3IgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKEJPRFkgdnMuIEhFQVJULCBCT0RZIHZzLiBNSU5ELCBhbmQgSEVBUlQgdnMuIE1JTkQpLCBJIHVzZWQgQmF5ZXNpYW4gcmVncmVzc2lvbiB0byBjb21wYXJlIGRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gdGhlc2UgdHdvIGNvbmNlcHR1YWwgdW5pdHMgdG8gemVybywgY29udHJvbGxpbmcgZm9yIGRpZmZlcmVuY2VzIGluIGFzc2Vzc21lbnRzIG9mIHRoZSB0d2VudHktb25lICJkaXZlcnNlIGNoYXJhY3RlcnMiIHRoYXQgd2VyZSBmZWF0dXJlZCBhcyB0YXJnZXQgY2hhcmFjdGVycyBpbiB0aGVzZSBzdHVkaWVzLiBTZWUgRmlndXJlIDQueCwgcGFuZWwgRCwgZm9yIHZpc3VhbCBkZXBpY3Rpb25zIG9mIHRoZXNlIGRpZmZlcmVuY2Ugc2NvcmVzLgoKYGBge3J9CiMgZmlndXJlIGRvbmUgYWJvdmUKYGBgCgpgYGB7cn0KIyByX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQxZF9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBIRUFSVCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpzdW1tYXJ5KHJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQxZF9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKc3VtbWFyeShyX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkMWRfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpyX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDFkX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKc3VtbWFyeShyX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKQpgYGAKCmBgYHtyfQpyZWd0YWJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfcmVnX3RhYmxlX2Z1bigKICByZWdfbGlzdCA9IGxpc3Qocl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKICAgICAgICAgICAgICAgICAgcl9kMWRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAogICAgICAgICAgICAgICAgICByX2QxZF9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKSwKICBwYWlyX2xpc3QgPSBjKCJCT0RZIC0gSEVBUlQiLCAiQk9EWSAtIE1JTkQiLCAiSEVBUlQgLSBNSU5EIiksCiAgc3R1ZHlfbmFtZSA9ICJTdHVkeSAxZCIsCiAgY2hhcl9sYWJlbCA9IGMoIkFkdWx0IHZzLiBHTSIsICJDaGlsZCB2cy4gR00iLCAiSW5mYW50IHZzLiBHTSIsICJQVlMgdnMuIEdNIiwgCiAgICAgICAgICAgICAgICAgIkZldHVzIHZzLiBHTSIsICJDaGltcGFuemVlIHZzLiBHTSIsICJFbGVwaGFudCB2cy4gR00iLCAKICAgICAgICAgICAgICAgICAiRG9scGhpbiB2cy4gR00iLCAiQmVhciB2cy4gR00iLCAiRG9nIHZzLiBHTSIsICJHb2F0IHZzLiBHTSIsIAogICAgICAgICAgICAgICAgICJNb3VzZSB2cy4gR00iLCAiRnJvZyB2cy4gR00iLCAiQmx1ZSBqYXkgdnMuIEdNIiwgIkZpc2ggdnMuIEdNIiwgCiAgICAgICAgICAgICAgICAgIkJlZXRsZSB2cy4gR00iLCAiTWljcm9iZSB2cy4gR00iLCAiUm9ib3QgdnMuIEdNIiwgCiAgICAgICAgICAgICAgICAgIkNvbXB1dGVyIHZzLiBHTSIsICJDYXIgdnMuIEdNIikpCmBgYAoKYGBge3J9CnJlZ3RhYl9zdHVkeTFkIDwtIHJlZ3RhYl9kMWRfYWRfc2NvcmVkX2FkX2RpZmYgJT4lCiAgbXV0YXRlX2F0KHZhcnMoYiwgcy5lLiksCiAgICAgICAgICAgIGZ1bnMoZm9ybWF0KHJvdW5kKC4sIGRpZ2l0cyA9IDIpLCBuc21hbGwgPSAyKSkpICU+JQogIHVuaXRlKHJlc3VsdCwgYiwgcy5lLiwgQ0k5NSwgbm9uemVybykgJT4lCiAgc3ByZWFkKHN0dWR5LCByZXN1bHQpICU+JQogIHNlcGFyYXRlKGBTdHVkeSAxZGAsIGMoInMxZF9iIiwgInMxZF9zLmUuIiwgInMxZF85NSUgQ0kiLCAiczFkX256IiksIHNlcCA9ICJfIikKYGBgCgpgYGB7cn0KIyBpbnRlcmltIHRhYmxlIGZvciBlYXNlIG9mIHdyaXRpbmcKcmVndGFiX3N0dWR5MWQgJT4lCiAgc2VsZWN0KC1lbmRzX3dpdGgoInMuZS4iKSkgJT4lCiAgZmlsdGVyKHBhcmFtID09ICJJbnRlcmNlcHQiKSAlPiUKICBrYWJsZShkaWdpdHMgPSAyKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpwbG90X2QxZF9hZF9zY29yZWRfYWRfZGlmZgpgYGAKCiMjIyMjIEJPRFkgdnMuIEhFQVJUCgpUaGVzZSByZWdyZXNzaW9uIGFuYWx5c2VzIGNvbmZpcm1lZCB0aGF0IGluIFN0dWR5IDFkLCBhcyBpbiBTdHVkaWVzIDFhLTFjLCBkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9IRUFSVF8gc2NhbGVzIHdlcmUgc3Vic3RhbnRpYWxseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIF9CT0RZXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0hFQVJUXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLiAKClRoaXMgYXN5bW1ldHJ5IHdhcyBtb3JlIHByb25vdW5jZWQgZm9yIHNvbWUgY2hhcmFjdGVycyAoYHIgbm9uemVyb19mdW4ocmVndGFiID0gcmVndGFiX2QxZF9hZF9zY29yZWRfYWRfZGlmZiwgd2hpY2hfcGFpciA9ICJCT0RZIC0gSEVBUlQiLCBwb3NfbmVnID0gInBvcyIpYCksIGFuZCBsZXNzIHByb25vdW5jZWQgZm9yIG90aGVycyAoYHIgbm9uemVyb19mdW4ocmVndGFiID0gcmVndGFiX2QxZF9hZF9zY29yZWRfYWRfZGlmZiwgd2hpY2hfcGFpciA9ICJCT0RZIC0gSEVBUlQiLCBwb3NfbmVnID0gIm5lZyIpYDsgc2VlIHRoZSAiVGFyZ2V0IGNoYXJhY3RlciIgcm93IGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KS4gQSBmdWxsIGRpc2N1c3Npb24gb2YgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMgaXMgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIGNoYXB0ZXIuCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpUaGVzZSByZWdyZXNzaW9uIGFuYWx5c2VzIGluZGljYXRlZCB0aGF0IGluIFN0dWR5IDFkLCBpbiBjb250cmFzdCB0byBTdHVkaWVzIDFhLTFjLCBkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9NSU5EXyBzY2FsZXMgd2VyZSBvbmx5IHZlcnkgc2xpZ2h0bHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9CT0RZXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQueCkuCgpBZ2FpbiwgdGhpcyBhc3ltbWV0cnkgd2FzIG1vcmUgcHJvbm91bmNlZCBmb3Igc29tZSBjaGFyYWN0ZXJzIChgciBub256ZXJvX2Z1bihyZWd0YWIgPSByZWd0YWJfZDFkX2FkX3Njb3JlZF9hZF9kaWZmLCB3aGljaF9wYWlyID0gIkJPRFkgLSBNSU5EIiwgcG9zX25lZyA9ICJwb3MiKWApLCBhbmQgbGVzcyBwcm9ub3VuY2VkIGZvciBvdGhlcnMgKGByIG5vbnplcm9fZnVuKHJlZ3RhYiA9IHJlZ3RhYl9kMWRfYWRfc2NvcmVkX2FkX2RpZmYsIHdoaWNoX3BhaXIgPSAiQk9EWSAtIE1JTkQiLCBwb3NfbmVnID0gIm5lZyIpYDsgc2VlIHRoZSAiVGFyZ2V0IGNoYXJhY3RlciIgcm93IGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLiBBIGZ1bGwgZGlzY3Vzc2lvbiBvZiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycyBpcyBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgY2hhcHRlci4KCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKVGhlc2UgcmVncmVzc2lvbiBhbmFseXNlcyBjb25maXJtZWQgdGhhdCBpbiBTdHVkeSAxZCwgYXMgaW4gU3R1ZGllcyAxYS0xYywgZGlmZmVyZW5jZSBzY29yZXMgY29tcGFyaW5nIHNjb3JlcyBvbiB0aGUgX0hFQVJUXyBhbmQgX01JTkRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9IRUFSVF8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KS4KCkFnYWluLCB0aGlzIGFzeW1tZXRyeSB3YXMgbW9yZSBwcm9ub3VuY2VkIGZvciBzb21lIGNoYXJhY3RlcnMgKGByIG5vbnplcm9fZnVuKHJlZ3RhYiA9IHJlZ3RhYl9kMWRfYWRfc2NvcmVkX2FkX2RpZmYsIHdoaWNoX3BhaXIgPSAiSEVBUlQgLSBNSU5EIiwgcG9zX25lZyA9ICJwb3MiKWApLCBhbmQgbGVzcyBwcm9ub3VuY2VkIGZvciBvdGhlcnMgKGByIG5vbnplcm9fZnVuKHJlZ3RhYiA9IHJlZ3RhYl9kMWRfYWRfc2NvcmVkX2FkX2RpZmYsIHdoaWNoX3BhaXIgPSAiSEVBUlQgLSBNSU5EIiwgcG9zX25lZyA9ICJuZWciKWA7IHNlZSB0aGUgIlRhcmdldCBjaGFyYWN0ZXIiIHJvdyBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQueCkuIEEgZnVsbCBkaXNjdXNzaW9uIG9mIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBjaGFwdGVyLgoKIyMjIyMgSW50ZXJpbSBkaXNjdXNzaW9uCgpUaGVzZSBmb3JtYWwgYW5hbHlzZXMgb2YgZGlmZmVyZW5jZSBzY29yZXMgYWNyb3NzIHRoZSBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NhbGVzIGluIFN0dWR5IDFkIGNvbmZpcm0gbXkgaW5mb3JtYWwgb2JzZXJ2YXRpb25zIG9mIGFzeW1tZXRyaWVzIGRlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbjogSW4gdGhpcyBzdHVkeSwgYXMgaW4gU3R1ZGllcyAxYS0xYyBhYm92ZSwgcGFydGljaXBhbnRzIHRlbmRlZCB0byBlbmRvcnNlIE1JTkQgbW9yZSBzdHJvbmdseSB0aGFuIEJPRFkgb3IgSEVBUlQsIGFuZCBCT0RZIG1vcmUgc3Ryb25nbHkgdGhhbiBIRUFSVC4KCmBgYHtyfQp0YWJsZTQueCA8LSByZWd0YWJfc3R1ZHkxZCAlPiUKICBzZWxlY3QoLXBhaXIsIC1lbmRzX3dpdGgoIl9zLmUuIikpICU+JQogIHJlbmFtZShQYXJhbWV0ZXIgPSBwYXJhbSkgJT4lCiAgcmVuYW1lX2FsbChmdW5zKGdzdWIoIm56IiwgIiAiLCAuKSkpICU+JQogIHJlbmFtZV9hbGwoZnVucyhnc3ViKCJzMS5fIiwgIiIsIC4pKSkgJT4lCiAga2FibGUoZm9ybWF0ID0gImh0bWwiLCBhbGlnbiA9IGMoImwiLCByZXAoYyhyZXAoInIiLCAyKSwgImwiKSwgMykpLCAKICAgICAgICBjYXB0aW9uID0gIlRhYmxlIDQueDogUmVncmVzc2lvbiBhbmFseXNlcyBvZiBkaWZmZXJlbmNlIHNjb3JlcyBmb3IgVVMgYWR1bHRzIGluIFN0dWR5IDFkLiBUaGUgdGFibGUgcHJlc2VudHMgcmVzdWx0cyBmcm9tIHNlcGFyYXRlIEJheWVzaWFuIHJlZ3Jlc3Npb25zIG9mIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChCT0RZIHZzLiBIRUFSVCwgQk9EWSB2cy4gTUlORCwgYW5kIEhFQVJUIHZzLiBNSU5EKS4gRWFjaCByZWdyZXNzaW9uIGluY2x1ZGVkIHR3byBmaXhlZCBlZmZlY3QgcGFyYW1ldGVyczogKDEpIHRoZSBpbnRlcmNlcHQsIHdoaWNoIEkgdHJlYXQgYXMgYW4gaW5kZXggb2YgdGhlIGFzeW1tZXRyeSBpbiBhdHRyaWJ1dGlvbnMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIGluIHF1ZXN0aW9uOyBhbmQgKDIpIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzLCByZXBvcnRlZCBoZXJlIGFzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGVhY2ggY2hhcmFjdGVyIGFuZCB0aGUgZ3JhbmQgbWVhbiAoR00pLiBJbnRlcmNlcHRzIGFyZSBoaWdobGlnaHRlZCBpbiBib2xkLCBiZWNhdXNlIHRoZXNlIGFyZSB0aGUgcHJpbWFyeSBwYXJhbWV0ZXJzIG9mIGludGVyZXN0IGZvciB0aGVzZSBhbmFseXNlcy4gRm9yIGVhY2ggcGFyYW1ldGVyLCB0aGUgdGFibGUgaW5jbHVkZXMgdGhlIGVzdGltYXRlIChiKSBhbmQgYSA5NSUgY3JlZGlibGUgaW50ZXJ2YWwgZm9yIHRoYXQgZXN0aW1hdGUuIEFzdGVyaXNrcyBpbmRpY2F0ZSA5NSUgY3JlZGlibGUgaW50ZXJ2YWxzIHRoYXQgZG8gbm90IGluY2x1ZGUgMC4iKSAlPiUgIAogIGthYmxlX3N0eWxpbmcoKSAlPiUKICByb3dfc3BlYyhjKDEsIDIyLCA0MyksIGJvbGQgPSBUKSAlPiUKICBncm91cF9yb3dzKCJCT0RZIC0gSEVBUlQiLCAxLCAyMSkgJT4lCiAgZ3JvdXBfcm93cygiQk9EWSAtIE1JTkQiLCAyMiwgNDIpICU+JQogIGdyb3VwX3Jvd3MoIkhFQVJUIC0gTUlORCIsIDQzLCA2MykgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICJTdHVkeSAxZCIgPSAzKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CnRhYmxlNC54CmBgYAoKIyMgRGlzY3Vzc2lvbgoKWFggX19JTlNFUlQgU1RVRFkgMSBESVNDVVNTSU9OX18KCgojIFN0dWR5IDI6IENvbmNlcHR1YWwgY2hhbmdlIGJldHdlZW4gbWlkZGxlIGNoaWxkaG9vZCAoNy05eSkgYW5kIGFkdWx0aG9vZAoKWFggX19JTlNFUlQgU1RVRFkgMiBJTlRST0RVQ1RJT05fXwoKSW4gU3R1ZHkgMiwgYHIgbnJvdyhkMl9hZF93aWRlKWAgVVMgYWR1bHRzIGFuZCBgciBucm93KGQyXzc5X3dpZGUpYCBVUyBjaGlsZHJlbiBiZXR3ZWVuIHRoZSBhZ2VzIG9mIGByIHN1bW1hcnkoZDJfNzkkYWdlKVsiTWluLiJdICU+JSByb3VuZCgyKWAtYHIgc3VtbWFyeShkMl83OSRhZ2UpWyJNYXguIl0gJT4lIHJvdW5kKDIpYCB5ZWFycyAobWVkaWFuOiBgciBzdW1tYXJ5KGQyXzc5JGFnZSlbIk1lZGlhbiJdICU+JSByb3VuZCgyKWB5KSBlYWNoIGFzc2Vzc2VkIGEgc2luZ2xlIHRhcmdldCBjaGFyYWN0ZXIgb24gNDAgbWVudGFsIGNhcGFjaXRpZXMuIFRvIG1ha2UgdGhlIHN0dWR5IGFwcHJvcHJpYXRlIGZvciBjaGlsZHJlbiBpbiB0aGlzIGFnZSByYW5nZSwgdGhlIHdvcmRpbmcgb2Ygc29tZSB0aGUgNDAgbWVudGFsIGNhcGFjaXRpZXMgZW1wbG95ZWQgaW4gU3R1ZHkgMSB3YXMgbW9kaWZpZWQgdG8gdXNlIG1vcmUgYWdlLWFwcHJvcHJpYXRlIHZvY2FidWxhcnksIGFuZCBwYXJ0aWNpcGFudHMgcmVzcG9uZGVkIG9uIGEgMy1wb2ludCBzY2FsZSAoIm5vLCIgY29kZWQgYXMgMDsgImtpbmRhLCIgY29kZWQgYXMgMC41LCAieWVzLCIgY29kZWQgYXMgMSkuIFRoaXMgc3R1ZHkgZW1wbG95ZWQgdGhlICJlZGdlIGNhc2UiIHZhcmlhbnQgb2YgdGhlIGdlbmVyYWwgYXBwcm9hY2gsIHdpdGggcGFydGljaXBhbnRzIHJhbmRvbWx5IGFzc2lnbmVkIHRvIGFzc2VzcyBlaXRoZXIgYSBiZWV0bGUgb3IgYSByb2JvdC4gKFNlZSBDaGFwdGVyIElJIGZvciBkZXRhaWxlZCBtZXRob2RzLikKCiMjIFJlc3VsdHMKCiMjIyBBZHVsdHMKCiMjIyMgU2NhbGUgY29uc3RydWN0aW9uCgpgYGB7cn0Kc2NhbGVzX2VmYV93ZG1fZDJfYWQgPC0gc2NhbGVfZnVuKGVmYV93ZG1fZDJfYWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2VmYV93ZG1fZDJfYWQpCmQyX2FkX3Njb3JlZF9hZCA8LSBzY29yZV9mdW4oZDJfYWQsIHNjYWxlc19lZmFfd2RtX2QyX2FkKQoKc2F2ZVJEUyhzY2FsZXNfZWZhX3dkbV9kMl9hZCwgZmlsZSA9ICIuL3N0b3JlZC9zY2FsZXMvc2NhbGVzX2VmYV93ZG1fZDJfYWQiKQpzYXZlUkRTKGQyX2FkX3Njb3JlZF9hZCwgZmlsZSA9ICIuL3N0b3JlZC9zY29yZWRfZGF0YS9kMl9hZF9zY29yZWRfYWQiKQpgYGAKCmBgYHtyfQojIGJpZyB0YWJsZSBmb3Igc2NhbGVzIGxvY2F0ZWQgYXQgc3R1ZHkgNApgYGAKCkZvbGxvd2luZyB0aGUgc3RlcHMgZGVzY3JpYmVkIGluICJHZW5lcmFsIGFuYWx5c2lzIHBsYW4sIiBhYm92ZSwgeWllbGRlZCBgciBmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QyX2FkKWAgc2NhbGVzIG9mIGByIHNjYWxlc19lZmFfd2RtX2QyX2FkICU+JSBjb3VudChmYWN0b3IpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4obikpICU+JSBzZWxlY3QobWVhbikgJT4lIGFzLm51bWVyaWMoKWAgaXRlbXMgZWFjaDsgc2VlIFRhYmxlIDQueC4KCiMjIyMgVmlzdWFsaXphdGlvbgoKYGBge3J9CnBsb3RzX2QyX2FkX3Njb3JlZF9hZCA8LSByZWx2aXpfZnVuKGQyX2FkX3Njb3JlZF9hZCkKYGBgCgpgYGB7cn0KZmlnX2QyX2FkX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kMl9hZF9zY29yZWRfYWRbWzFdXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QyX2FkX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QyX2FkX3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkExIiwgIkEyIiwgIkEzIiksIG5jb2wgPSAzKQoKZmlnX2QyX2FkX2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2QyX2FkX3Njb3JlZF9hZFtbMV1dICsgCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKCmZpZ19kMl9hZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kMl9hZF9wbG90cywgZmlnX2QyX2FkX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kMl9hZF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDI6IEFkdWx0cyIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDJfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDJfYWRfdGl0bGUsIGZpZ19kMl9hZF9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKZmlnX2QyX2FkX3Bsb3RzX2xlZ190aXRsZQpgYGAKClZpc3VhbGl6YXRpb25zIG9mIHJlbGF0aW9uc2hpcHMgYW1vbmcgc2NvcmVzIG9uIHRoZXNlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYXJlIHByb3ZpZGVkIGluIEZpZ3VyZSA0LngsIHJvdyBBLgoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkZpcnN0IEkgd2lsbCBjb25zaWRlciB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQk9EWSBhbmQgSEVBUlQgKEZpZ3VyZSA0LngsIHBhbmVsIEExKS4gTXVjaCBhcyBpbiBTdHVkeSAxLCB0aGUgbW9zdCBzdHJpa2luZyBmZWF0dXJlcyBvZiB0aGlzIHZpc3VhbGl6YXRpb24gYXJlIHRoYXQgKDEpIHRoZXJlIGlzIGEgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9IRUFSVF8gc2NhbGVzOyBhbmQgKDIpIHRoZXJlIGFyZSB2ZXJ5IGZldyBkYXRhcG9pbnRzIGFib3ZlIHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkLCBkb3R0ZWQgZGlhZ29uYWwgbGluZSksIGFuZCBjZXJ0YWlubHkgbm8gZGF0YXBvaW50cyBpbiB1cHBlciBsZWZ0IHF1YWRyYW50LiBJbmRpdmlkdWFsIHBhcnRpY2lwYW50cyB0ZW5kZWQgdG8gZW5kb3JzZSB0aGUgbWVudGFsIGNhcGFjaXR5IGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBfQk9EWV8gc2NhbGUgYXQgbGVhc3QgYXMgc3Ryb25nbHksIGFuZCBvZnRlbiBtb3JlIHN0cm9uZ2x5LCB0aGFuIHRoZXkgZW5kb3JzZWQgaXRlbXMgaW5jbHVkZWQgaW4gdGhlIF9IRUFSVF8gc2NhbGXigJRpbiBvdGhlciB3b3JkcywgbWFueSBwYXJ0aWNpcGFudHMgYXR0cmlidXRlZCBtb3JlIEJPRFkgdGhhbiBIRUFSVCB0byB0aGUgdGFyZ2V0IGNoYXJhY3RlciBpbiBxdWVzdGlvbiwgYnV0IHZpcnR1YWxseSBubyBwYXJ0aWNpcGFudHMgYXR0cmlidXRlZCBtb3JlIEhFQVJUIHRoYW4gQk9EWS4gQXMgaW4gU3R1ZGllcyAxYS0xYyAod2hpY2ggYWxzbyBmZWF0dXJlZCB0aGVzZSB0d28gImVkZ2UgY2FzZXMiIGFzIHRhcmdldCBjaGFyYWN0ZXJzKSwgdGhpcyBhc3ltbWV0cnkgYXBwZWFycyB0byBoYXZlIGJlZW4gZHJpdmVuIHByaW1hcmlseSBieSBhc3Nlc3NtZW50cyBvZiB0aGUgYmVldGxlIChpbiByZWQpLCByYXRoZXIgdGhhbiB0aGUgcm9ib3QgKGluIGJsdWUpLgoKIyMjIyMgQk9EWSB2cy4gTUlORAoKTmV4dCBJIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJPRFkgYW5kIE1JTkQgKEZpZ3VyZSA0LngsIHBhbmVsIEEyKS4gQXMgaW4gU3R1ZHkgMSwgdHdvIG5vdGFibGUgZmVhdHVyZXMgb2YgdGhpcyB2aXN1YWxpemF0aW9uIGFyZSB0aGF0ICgxKSB0aGVyZSBpcyBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzOyBhbmQgKDIpIHRoZXJlIGFyZSBmZXdlciBkYXRhcG9pbnRzIGJlbG93IHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkLCBkb3R0ZWQgZGlhZ29uYWwgbGluZSkgdGhhbiBhYm92ZSBpdCwgYW5kIG5vIGRhdGFwb2ludHMgaW4gbG93ZXIgcmlnaHQgcXVhZHJhbnQuIE1vc3QgcGFydGljaXBhbnRzIHRlbmRlZCB0byBlbmRvcnNlIHRoZSBtZW50YWwgY2FwYWNpdHkgaXRlbXMgaW5jbHVkZWQgaW4gdGhlIF9NSU5EXyBzY2FsZSByb3VnaGx5IGFzIHN0cm9uZ2x5LCBhbmQgc29tZXRpbWVzIG1vcmUgc3Ryb25nbHksIHRoYW4gdGhleSBlbmRvcnNlZCBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX0JPRFlfIHNjYWxlLCB3aGlsZSByZWxhdGl2ZWx5IGZldyBwYXJ0aWNwaWFudHMgZW5kb3JzZWQgX01JTkRfIGl0ZW1zIGxlc3Mgc3Ryb25nbHkgdGhhbiBfQk9EWV8gaXRlbXMgKHRob3VnaCB0aGlzIGFzeW1tZXRyeSBhcHBlYXJzIHRvIGhhdmUgYmVlbiBsZXNzIGV4dHJlbWUgdGhhbiB0aGUgYXN5bW1ldHJ5IGJldHdlZW4gX0JPRFlfIGFuZCBfSEVBUlRfIHNjb3JlcyBkb2N1bWVudGVkIGluIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGgpLiBBcyBpbiB0aGUgQk9EWSB2cy4gTUlORCBjb21wYXJpc29uIGZvciBTdHVkaWVzIDFhLTFjICh3aGljaCBhbHNvIGZlYXR1cmVkIHRoZXNlIHR3byAiZWRnZSBjYXNlcyIgYXMgdGFyZ2V0IGNoYXJhY3RlcnMpLCB0aGUgYXN5bW1ldHJ5IGJldHdlZW4gX0JPRFlfIGFuZCBfTUlORF8gYXBwZWFycyB0byBoYXZlIGJlZW4gZHJpdmVuIHByaW1hcmlseSBieSBwYXJ0aWNpcGFudHMnIGFzc2Vzc21lbnRzIG9mIHRoZSByb2JvdCAoaW4gYmx1ZSksIHJhdGhlciB0aGFuIHRoZSBiZWV0bGUgKGluIHJlZCkuIAoKIyMjIyMgSEVBUlQgdnMuIE1JTkQKCkZpbmFsbHkgSSB3aWxsIGNvbnNpZGVyIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBIRUFSVCBhbmQgTUlORCAoRmlndXJlIDQueCwgcGFuZWwgQTEpLiBBcyBpbiBTdHVkeSAxLCB0aGUgbW9zdCBzdHJpa2luZyBmZWF0dXJlcyBvZiB0aGlzIHZpc3VhbGl6YXRpb24gYXJlIHRoYXQgKDEpIHRoZXJlIGlzIGEgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfSEVBUlRfIGFuZCBfTUlORF8gc2NhbGVzOyBhbmQgKDIpIHRoZXJlIGFyZSB2aXJ0dWFsbHkgbm8gZGF0YXBvaW50cyBiZWxvdyB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpLCBhbmQgY2VydGFpbmx5IG5vIGRhdGFwb2ludHMgaW4gbG93ZXIgcmlnaHQgcXVhZHJhbnQuIEluZGl2aWR1YWwgcGFydGljaXBhbnRzIHRlbmRlZCB0byBlbmRvcnNlIHRoZSBtZW50YWwgY2FwYWNpdHkgaXRlbXMgaW5jbHVkZWQgaW4gdGhlIF9NSU5EXyBzY2FsZSBhdCBsZWFzdCBhcyBzdHJvbmdseSwgYW5kIG9mdGVuIG1vcmUgc3Ryb25nbHksIHRoYW4gdGhleSBlbmRvcnNlZCBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX0hFQVJUXyBzY2FsZeKAlGluIG90aGVyIHdvcmRzLCBtYW55IHBhcnRpY2lwYW50cyBhdHRyaWJ1dGVkIG1vcmUgTUlORCB0aGFuIEhFQVJUIHRvIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGluIHF1ZXN0aW9uLCBidXQgdmlydHVhbGx5IG5vIHBhcnRpY2lwYW50cyBhdHRyaWJ1dGVkIG1vcmUgSEVBUlQgdGhhbiBNSU5ELiBBcyBpbiB0aGUgSEVBUlQgdnMuIE1JTkQgY29tcGFyaXNvbiBmb3IgU3R1ZGllcyAxYS0xYyAod2hpY2ggYWxzbyBmZWF0dXJlZCB0aGVzZSB0d28gImVkZ2UgY2FzZXMiIGFzIHRhcmdldCBjaGFyYWN0ZXJzKSwgdGhpcyBhc3ltbWV0cnkgYXBwZWFycyB0byBoYXZlIGJlZW4gcGFydGljdWxhcmx5IGV4dHJlbWU6IEFsbW9zdCBfYWxsXyBwYXJ0aWNpcGFudHMgZW5kb3JzZWQgdGhlIG1lbnRhbCBjYXBhY2l0eSBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX01JTkRfIHNjYWxlIG1vcmUgc3Ryb25nbHkgdGhhbiB0aGUgaXRlbXMgaW5jbHVkZWQgaW4gdGhlIF9IRUFSVF8gc2NhbGUuIEFnYWluLCB0aGlzIGFzeW1tZXRyeSBhcHBlYXJzIHRvIGJlIGJvcm4gb3V0IGZvciBib3RoIHRhcmdldCBjaGFyYWN0ZXJzLCBidXQgcGVyaGFwcyBtb3JlIGV4YWdnZXJhdGVkIGZvciB0aGUgYmVldGxlIChpbiByZWQpIHRoYW4gdGhlIHJvYm90IChpbiBibHVlKS4KCiMjIyMjIEludGVyaW0gZGlzY3Vzc2lvbgoKTXkgaW5mb3JtYWwgb2JzZXJ2YXRpb25zIG9mIHRoZSByZWxhdGlvbnNoaXBzIGFtb25nIGFkdWx0cycgZW5kb3JzZW1lbnRzIG9mIHRoZSB0aGUgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkeSAyIGFyZSB2ZXJ5IHNpbWlsYXIgdG8gdGhvc2UgZm9yIGFkdWx0cyBpbiBTdHVkeSAxOiAoMSkgQWxsIG9mIHRoZXNlIGludGVyLXVuaXQgcmVsYXRpb25zaGlwcyB3ZXJlIHBvc2l0aXZlLCBzdWNoIHRoYXQgdGhlIG1vcmUgc3Ryb25nbHkgYSBwYXJ0aWNpcGFudCBlbmRvcnNlZCBvbmUgY29uY2VwdHVhbCB1bml0LCB0aGUgbW9yZSBzdHJvbmdseSB0aGV5IHRlbmRlZCB0byBlbmRvcnNlIHRoZSBvdGhlcnM7IGFuZCAoMikgVGhlcmUgd2VyZSByb2J1c3QgYXN5bW1ldHJpZXMgaW4gdGhlc2UgcG9zaXRpdmUgcmVsYXRpb25zaGlwcywgc3VjaCB0aGF0IHBhcnRpY2lwYW50cyB0ZW5kZWQgdG8gZW5kb3JzZSBNSU5EIG1vcmUgc3Ryb25nbHkgdGhhbiBCT0RZIG9yIEhFQVJULCBhbmQgSEVBUlQgbW9yZSBzdHJvbmdseSB0aGFuIE1JTkQuIEFzIGluIFN0dWRpZXMgMWEtMWMsIHZpc3VhbCBpbnNwZWN0aW9uIHN1Z2dlc3RzIHRoYXQgdGhlc2UgYXN5bW1ldHJpZXMgd2VyZSBtb3N0IHByb25vdW5jZWQgZm9yIGNvbXBhcmlzb25zIGludm9sdmluZyBIRUFSVCwgd2l0aCB2aXJ0dWFsbHkgZXZlcnkgcGFydGljaXBhbnQgYWNyb3NzIGFsbCB0aHJlZSBvZiB0aGVzZSBzdHVkaWVzIGVuZG9yc2luZyBib3RoIEJPRFkgYW5kIE1JTkQgbW9yZSBzdHJvbmdseSB0aGFuIEhFQVJUIGZvciBib3RoIG9mIHRoZSAiZWRnZSBjYXNlIiBjaGFyYWN0ZXJzIGluY2x1ZGVkIGluIHRoZXNlIHN0dWRpZXMgKGEgYmVldGxlIGFuZCBhIHJvYm90KS4gCgojIyMjIEFuYWx5c2lzIG9mIGFzeW1tZXRyaWVzCgpIZXJlIEkgcHJvdmlkZSBhIGZvcm1hbCBhbmFseXNpcyBvZiB0aGUgYXN5bW1ldHJpZXMgcmV2ZWFsZWQgYnkgdGhlIHZpc3VhbGl6YXRpb25zIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLiBBcyBpbiBTdHVkaWVzIDFhLTFjLCBmb3IgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKEJPRFkgdnMuIEhFQVJULCBCT0RZIHZzLiBNSU5ELCBhbmQgSEVBUlQgdnMuIE1JTkQpLCBJIHVzZWQgQmF5ZXNpYW4gcmVncmVzc2lvbiB0byBjb21wYXJlIGRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gdGhlc2UgdHdvIGNvbmNlcHR1YWwgdW5pdHMgdG8gemVybywgY29udHJvbGxpbmcgZm9yIGRpZmZlcmVuY2VzIGluIGFzc2Vzc21lbnRzIG9mIHRoZSB0d28gImVkZ2UgY2FzZXMiIHRoYXQgd2VyZSBmZWF0dXJlZCBhcyB0YXJnZXQgY2hhcmFjdGVycyBpbiB0aGVzZSBzdHVkaWVzLiBTZWUgRmlndXJlIDQueCwgcGFuZWwgRCwgZm9yIHZpc3VhbCBkZXBpY3Rpb25zIG9mIHRoZXNlIGRpZmZlcmVuY2Ugc2NvcmVzLgoKYGBge3J9CmQyX2FkX3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfZnVuKGQyX2FkX3Njb3JlZF9hZCkKY29udHJhc3RzKGQyX2FkX3Njb3JlZF9hZF9kaWZmJGNoYXJhY3RlcikgPC0gY29udHJhc3RzX3N1bV9lZGdlCgpzYXZlUkRTKGQyX2FkX3Njb3JlZF9hZF9kaWZmLCAiLi9zdG9yZWQvZGlmZnNjb3JlX2RhdGEvZDJfYWRfc2NvcmVkX2FkX2RpZmYiKQpgYGAKCmBgYHtyfQpwbG90X2QyX2FkX3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZwbG90X2Z1bihkMl9hZF9zY29yZWRfYWRfZGlmZikKYGBgCgpgYGB7cn0KIyByX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKcl9kMl9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpzdW1tYXJ5KHJfZDJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkMl9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpyX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpzdW1tYXJ5KHJfZDJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDJfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkMl9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMl9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDJfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpyX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnN1bW1hcnkocl9kMl9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKQpgYGAKCmBgYHtyfQpyZWd0YWJfZDJfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9yZWdfdGFibGVfZnVuKAogIHJlZ19saXN0ID0gbGlzdChyX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiAgICAgICAgICAgICAgICAgIHJfZDJfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAogICAgICAgICAgICAgICAgICByX2QyX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpLAogIHBhaXJfbGlzdCA9IGMoIkJPRFkgLSBIRUFSVCIsICJCT0RZIC0gTUlORCIsICJIRUFSVCAtIE1JTkQiKSwKICBzdHVkeV9uYW1lID0gIkFkdWx0cyIsCiAgY2hhcl9sYWJlbCA9ICJSb2JvdCB2cy4gR00iKQpgYGAKCmBgYHtyfQojIGludGVyaW0gdGFibGUgZm9yIGVhc2Ugb2Ygd3JpdGluZwpyZWd0YWJfZDJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lCiAgc2VsZWN0KC1zdHVkeSwgLXMuZS4pICU+JQogIGZpbHRlcihwYXJhbSA9PSAiSW50ZXJjZXB0IikgJT4lCiAga2FibGUoZGlnaXRzID0gMikgJT4lCiAga2FibGVfc3R5bGluZygpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKcGxvdF9kMl9hZF9zY29yZWRfYWRfZGlmZgpgYGAKCiMjIyMjIEJPRFkgdnMuIEhFQVJUCgpBcyBpbiBTdHVkeSAxLCBhbW9uZyBhZHVsdHMgaW4gU3R1ZHkgMiwgZGlmZmVyZW5jZSBzY29yZXMgY29tcGFyaW5nIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfQk9EWV8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9IRUFSVF8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KS4gQXMgSSBzcGVjdWxhdGVkIGVhcmxpZXIsIHRoaXMgZGlmZmVyZW5jZSB3YXMgZHJpdmVuIGJ5IHBhcnRpY2lwYW50cycgYXNzZXNzbWVudHMgb2YgdGhlIGJlZXRsZTsgaW4gdGhlIGFnZ3JlZ2F0ZSwgZGlmZmVyZW5jZSBzY29yZXMgd2VyZSByZWR1Y2VkIHRvIDAgZm9yIHRoZSByb2JvdCAoc2VlIHRoZSAiVGFyZ2V0IGNoYXJhY3RlciIgcm93IGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KS4gIAoKIyMjIyMgQk9EWSB2cy4gTUlORAoKQXMgaW4gU3R1ZGllcyAxYS0xYyAod2hpY2ggZmVhdHVyZWQgdGhlIHNhbWUgImVkZ2UgY2FzZXMiIGFzIHRhcmdldCBjaGFyYWN0ZXJzKSwgYW1vbmcgYWR1bHRzIGluIFN0dWR5IDIsIGRpZmZlcmVuY2Ugc2NvcmVzIGNvbXBhcmluZyBzY29yZXMgb24gdGhlIF9CT0RZXyBhbmQgX01JTkRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9CT0RZXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQueCkuIFRoaXMgZGlmZmVyZW5jZSB3YXMgZHJpdmVuIGJ5IHBhcnRpY2lwYW50cycgYXNzZXNzbWVudHMgb2YgdGhlIHJvYm90OyBpbiB0aGUgYWdncmVnYXRlLCBkaWZmZXJlbmNlIHNjb3JlcyB3ZXJlIHJlZHVjZWQgdG8gMCBmb3IgdGhlIGJlZXRsZSAoc2VlIHRoZSAiVGFyZ2V0IGNoYXJhY3RlciIgcm93IGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLgoKIyMjIyMgSEVBUlQgdnMuIE1JTkQKCkFzIGluIFN0dWR5IDEsIGFtb25nIGFkdWx0cyBpbiBTdHVkeSAyLCBkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgc2NvcmVzIG9uIHRoZSBfSEVBUlRfIGFuZCBfTUlORF8gc2NhbGVzIHdlcmUgc3Vic3RhbnRpYWxseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIF9NSU5EXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0hFQVJUXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiSEVBUlQtTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLiBBcyBpbiBTdHVkaWVzIDFhLTFjLCB0aGlzIGRpZmZlcmVuY2Ugd2FzIHNvbWV3aGF0IGV4YWdnZXJhdGVkIGluIGFzc2Vzc21lbnRzIG9mIHRoZSByb2JvdCwgcmVsYXRpdmUgdG8gdGhlIGJlZXRsZSAoc2VlIHRoZSAiVGFyZ2V0IGNoYXJhY3RlciIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KS4KCiMjIyMjIEludGVyaW0gZGlzY3Vzc2lvbgoKVGhlc2UgZm9ybWFsIGFuYWx5c2VzIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGFjcm9zcyB0aGUgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjYWxlcyBhbW9uZyBhZHVsdHMgaW4gU3R1ZHkgMiBjb25maXJtIG15IGluZm9ybWF0aW9uIG9ic2VydmF0aW9ucyBvZiBhc3ltbWV0cmllcyBkZXNjcmliZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24sIGFuZCBhbGlnbiBxdWl0ZSBjbG9zZWx5IHdpdGggYW5hbHlzZXMgb2YgYWR1bHRzIGluIFN0dWRpZXMgMWEtMWM6IEFjcm9zcyBhbGwgb2YgdGhlc2Ugc3R1ZGllcywgcGFydGljaXBhbnRzIHRlbmRlZCB0byBlbmRvcnNlIE1JTkQgbW9yZSBzdHJvbmdseSB0aGFuIEJPRFkgb3IgSEVBUlQsIGFuZCBCT0RZIG1vcmUgc3Ryb25nbHkgdGhhbiBIRUFSVC4KCiMjIyBDaGlsZHJlbiAoNy05eSkKCmBgYHtyfQpkMl83OV9zY29yZWRfYWQgPC0gc2NvcmVfZnVuKGQyXzc5LCBzY2FsZXNfZWZhX3dkbV9kMl9hZCkKc2F2ZVJEUyhkMl83OV9zY29yZWRfYWQsIGZpbGUgPSAiLi9zdG9yZWQvc2NvcmVkX2RhdGEvZDJfNzlfc2NvcmVkX2FkIikKYGBgCgpYWCBfX0lOU0VSVCBTRUNUSU9OIElOVFJPRFVDVElPTi9UUkFOU0lUSU9OX18KCiMjIyMgVmlzdWFsaXphdGlvbgoKYGBge3J9CnBsb3RzX2QyXzc5X3Njb3JlZF9hZCA8LSByZWx2aXpfZnVuKGQyXzc5X3Njb3JlZF9hZCkKYGBgCgpgYGB7cn0KZmlnX2QyXzc5X3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kMl83OV9zY29yZWRfYWRbWzFdXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QyXzc5X3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QyXzc5X3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkIxIiwgIkIyIiwgIkIzIiksIG5jb2wgPSAzKQoKZmlnX2QyXzc5X2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2QyXzc5X3Njb3JlZF9hZFtbMV1dICsgCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKCmZpZ19kMl83OV9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kMl83OV9wbG90cywgZmlnX2QyXzc5X2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kMl83OV90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDI6IENoaWxkcmVuLCA3LTl5IChzY29yZWQgdXNpbmcgYWR1bHRzJyBzY2FsZXMpIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kMl83OV9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKGZpZ19kMl83OV90aXRsZSwgZmlnX2QyXzc5X3Bsb3RzX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpmaWdfZDJfNzlfcGxvdHNfbGVnX3RpdGxlCmBgYAoKVmlzdWFsaXphdGlvbnMgb2YgcmVsYXRpb25zaGlwcyBhbW9uZyBzY29yZXMgb24gdGhlc2UgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjYWxlcyBhcmUgcHJvdmlkZWQgaW4gRmlndXJlIDQueCwgcm93IEIuCgojIyMjIyBCT0RZIHZzLiBIRUFSVAoKRmlyc3QgSSB3aWxsIGNvbnNpZGVyIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBCT0RZIGFuZCBIRUFSVCAoRmlndXJlIDQueCwgcGFuZWwgQjEpLiBBcyBhbW9uZyBhZHVsdHMgaW4gdGhpcyBzdHVkeSAocGFuZWwgQTEpLCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9IRUFSVF8gc2NhbGVzIGFwcGVhcnMgdG8gYmUgc29tZXdoYXQgcG9zaXRpdmUsIGFuZCB0aGVyZSBhcHBlYXIgdG8gYmUgc29tZXdoYXQgZmV3ZXIgZGF0YXBvaW50cyBhYm92ZSB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpIHRoYW4gYmVsb3cgaXTigJRidXQgYm90aCBvZiB0aGVzZSBvYnNlcnZhdGlvbnMgYXJlIG11Y2ggbGVzcyBzdHJpa2luZyBhbW9uZyBjaGlsZHJlbiB0aGFuIHRoZXkgd2VyZSBhbW9uZyBhZHVsdHMuIEluIG90aGVyIHdvcmRzLCB3aGlsZSBtYW55IGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBCT0RZIHRoYW4gSEVBUlQgdG8gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24gKGxpa2UgdGhlIHZhc3QgbWFqb3JpdHkgb2YgYWR1bHRzKSwgcXVpdGUgYSBmZXcgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIEhFQVJUIHRoYW4gQk9EWS4gRnVydGhlcm1vcmUsIGEgdmlzdWFsIGluc3BlY3Rpb24gb2YgdGhpcyBwbG90IHN1Z2dlc3RzIHRoYXQgdGhlIGFzeW1tZXRyeSBtYXkgaGF2ZSBldmVuIGdvbmUgaW4gb3Bwb3NpdGUgZGlyZWN0aW9ucyBmb3IgdGhlIHR3byB0YXJnZXQgY2hhcmFjdGVycywgd2l0aCBjaGlsZHJlbiB0ZW5kaW5nIHRvIGF0dHJpYnV0ZSBtb3JlIEJPRFkgdGhhbiBIRUFSVCB0byB0aGUgYmVldGxlIChpbiByZWQpIGJ1dCwgaWYgYW55dGhpbmcsIG1vcmUgSEVBUlQgdGhhbiBCT0RZIHRvIHRoZSByb2JvdCAoaW4gYmx1ZSkuCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpOZXh0IEkgd2lsbCBjb25zaWRlciB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQk9EWSBhbmQgTUlORCAoRmlndXJlIDQueCwgcGFuZWwgQjIpLiBBcyBhbW9uZyBhZHVsdHMgaW4gdGhpcyBzdHVkeSAocGFuZWwgQTIpLCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9NSU5EXyBzY2FsZXMgYXBwZWFycyB0byBiZSBzb21ld2hhdCBwb3NpdGl2ZSwgYW5kIHRoZXJlIGFwcGVhciB0byBiZSBzb21ld2hhdCBmZXdlciBkYXRhcG9pbnRzIGJlbG93IHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkLCBkb3R0ZWQgZGlhZ29uYWwgbGluZSkgdGhhbiBhYm92ZSBpdOKAlGJ1dCwgYXMgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24sIGJvdGggb2YgdGhlc2Ugb2JzZXJ2YXRpb25zIGFyZSBtdWNoIGxlc3Mgc3RyaWtpbmcgYW1vbmcgY2hpbGRyZW4gdGhhbiB0aGV5IHdlcmUgYW1vbmcgYWR1bHRzLiBJbiBvdGhlciB3b3Jkcywgd2hpbGUgbWFueSBjaGlsZHJlbiBhdHRyaWJ1dGVkIG1vcmUgTUlORCB0aGFuIEJPRFkgdG8gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24gKGxpa2UgdGhlIHZhc3QgbWFqb3JpdHkgb2YgYWR1bHRzKSwgcXVpdGUgYSBmZXcgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIEJPRFkgdGhhbiBNSU5ELiBGdXJ0aGVybW9yZSwgYSB2aXN1YWwgaW5zcGVjdGlvbiBvZiB0aGlzIHBsb3Qgc3VnZ2VzdHMgdGhhdCB0aGUgYXN5bW1ldHJ5IG1heSBoYXZlIGV2ZW4gZ29uZSBpbiBvcHBvc2l0ZSBkaXJlY3Rpb25zIGZvciB0aGUgdHdvIHRhcmdldCBjaGFyYWN0ZXJzLCB3aXRoIGNoaWxkcmVuIHRlbmRpbmcgdG8gYXR0cmlidXRlIG1vcmUgTUlORCB0aGFuIEJPRFkgdG8gdGhlIHJvYm90IChpbiBibHVlKSBidXQsIGlmIGFueXRoaW5nLCBtb3JlIEJPRFkgdGhhbiBNSU5EIHRvIHRoZSBiZWV0bGUgKGluIHJlZCkuCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKRmluYWxseSBJIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEhFQVJUIGFuZCBNSU5EIChGaWd1cmUgNC54LCBwYW5lbCBCMykuIEFzIGFtb25nIGFkdWx0cyBpbiB0aGlzIHN0dWR5IChwYW5lbCBBMyksIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzY29yZXMgb24gdGhlIF9IRUFSVF8gYW5kIF9NSU5EXyBzY2FsZXMgYXBwZWFycyB0byBiZSBzb21ld2hhdCBwb3NpdGl2ZSwgYW5kIHRoZXJlIGFwcGVhciB0byBiZSBzb21ld2hhdCBmZXdlciBkYXRhcG9pbnRzIGJlbG93IHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkLCBkb3R0ZWQgZGlhZ29uYWwgbGluZSkgdGhhbiBhYm92ZSBpdOKAlGJ1dCwgYXMgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb25zLCBib3RoIG9mIHRoZXNlIG9ic2VydmF0aW9ucyBhcmUgbXVjaCBsZXNzIHN0cmlraW5nIGFtb25nIGNoaWxkcmVuIHRoYW4gdGhleSB3ZXJlIGFtb25nIGFkdWx0cy4gSW4gb3RoZXIgd29yZHMsIHdoaWxlIG1hbnkgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIE1JTkQgdGhhbiBIRUFSVCB0byB0aGUgdGFyZ2V0IGNoYXJhY3RlciBpbiBxdWVzdGlvbiAobGlrZSB0aGUgdmFzdCBtYWpvcml0eSBvZiBhZHVsdHMpLCBxdWl0ZSBhIGZldyBjaGlsZHJlbiBhdHRyaWJ1dGVkIG1vcmUgSEVBUlQgdGhhbiBNSU5ELiBUaGlzIGFwcGVhcnMgdG8gaGF2ZSBiZWVuIHRydWUgZm9yIGJvdGggdGFyZ2V0IGNoYXJhY3RlcnMuCgojIyMjIyBJbnRlcmltIGRpc2N1c3Npb24KCk15IGluZm9ybWFsIG9ic2VydmF0aW9ucyBvZiB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyBjaGlscmRlbidzIGVuZG9yc2VtZW50cyBvZiB0aGUgdGhlIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZHkgMiBhcmUgZ2VuZXJhbGx5IHNpbWlsYXIgdG8gdGhvc2Ugb2YgYWR1bHRzIGluIHRoaXMgc3R1ZHksIGJ1dCBkcmFtYXRpY2FsbHkgYXR0ZW51YXRlZDogKDEpIEFsbCBvZiB0aGVzZSBpbnRlci11bml0IHJlbGF0aW9uc2hpcHMgd2VyZSBzb21ld2FodCBwb3NpdGl2ZSwgYnV0IG9ubHkgc29tZXdoYXQ7IGFuZCAoMikgVGhlcmUgd2FzIHNvbWUgZXZpZGVuY2Ugb2YgYXN5bW1ldHJpZXMgaW4gdGhlc2UgcG9zaXRpdmUgcmVsYXRpb25zaGlwcywgYnV0IHRoZXNlIGFzeW1tZXRyaWVzIHdlcmUgZ2VuZXJhbGx5IHdlYWtlciBhbmQgYXBwZWFyZWQgdG8gYmUgaGlnaGx5IGRlcGVuZGVudCBvbiB3aGljaCB0YXJnZXQgY2hhcmFjdGVyIHBhcnRpY2lwYW50cyBhc3Nlc3NlZCAocGFydGljdWxhcmx5IGZvciB0aGUgQk9EWSB2cy4gSEVBUlQgYW5kIEJPRFkgdnMuIE1JTkQgY29tcGFyaXNvbnMpLgoKIyMjIyBBbmFseXNpcyBvZiBhc3ltbWV0cmllcwoKSGVyZSBJIHByb3ZpZGUgYSBmb3JtYWwgYW5hbHlzaXMgb2YgdGhlIGFzeW1tZXRyaWVzIHJldmVhbGVkIGJ5IHRoZSB2aXN1YWxpemF0aW9ucyBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4gQXMgaW4gcHJldmlvdXMgYW5hbHlzZXMsIGZvciBlYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cyAoQk9EWSB2cy4gSEVBUlQsIEJPRFkgdnMuIE1JTkQsIGFuZCBIRUFSVCB2cy4gTUlORCksIEkgdXNlZCBCYXllc2lhbiByZWdyZXNzaW9uIHRvIGNvbXBhcmUgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiB0aGVzZSB0d28gY29uY2VwdHVhbCB1bml0cyB0byB6ZXJvLCBjb250cm9sbGluZyBmb3IgZGlmZmVyZW5jZXMgaW4gYXNzZXNzbWVudHMgb2YgdGhlIHR3byAiZWRnZSBjYXNlcyIgdGhhdCB3ZXJlIGZlYXR1cmVkIGFzIHRhcmdldCBjaGFyYWN0ZXJzIGluIHRoZXNlIHN0dWRpZXMgKGJlZXRsZSBhbmQgcm9ib3QpLiBTZWUgRmlndXJlIDQuWFgsIHBhbmVsIEIsIGZvciB2aXN1YWwgZGVwaWN0aW9ucyBvZiB0aGVzZSBkaWZmZXJlbmNlIHNjb3Jlcy4KCmBgYHtyfQpkMl83OV9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX2Z1bihkMl83OV9zY29yZWRfYWQpCmNvbnRyYXN0cyhkMl83OV9zY29yZWRfYWRfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZWRnZQoKc2F2ZVJEUyhkMl83OV9zY29yZWRfYWRfZGlmZiwgIi4vc3RvcmVkL2RpZmZzY29yZV9kYXRhL2QyXzc5X3Njb3JlZF9hZF9kaWZmIikKYGBgCgpgYGB7cn0KcGxvdF9kMl83OV9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDJfNzlfc2NvcmVkX2FkX2RpZmYpCmBgYAoKYGBge3J9CiMgcl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQyXzc5X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKcl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKc3VtbWFyeShyX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKcl9kMl83OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDJfNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDJfNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCkKYGBgCgpgYGB7cn0KcmVndGFiX2QyXzc5X3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfcmVnX3RhYmxlX2Z1bigKICByZWdfbGlzdCA9IGxpc3Qocl9kMl83OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2QyXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKICAgICAgICAgICAgICAgICAgcl9kMl83OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKSwKICBwYWlyX2xpc3QgPSBjKCJCT0RZIC0gSEVBUlQiLCAiQk9EWSAtIE1JTkQiLCAiSEVBUlQgLSBNSU5EIiksCiAgc3R1ZHlfbmFtZSA9ICJDaGlsZHJlbiwgNy05eSAodXNpbmcgYWR1bHRzJyBzY2FsZXMpIiwKICBjaGFyX2xhYmVsID0gIlJvYm90IHZzLiBHTSIpCmBgYAoKYGBge3J9CiMgaW50ZXJpbSB0YWJsZSBmb3IgZWFzZSBvZiB3cml0aW5nCnJlZ3RhYl9kMl83OV9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXN0dWR5LCAtcy5lLikgJT4lCiAgZmlsdGVyKHBhcmFtID09ICJJbnRlcmNlcHQiKSAlPiUKICBrYWJsZShkaWdpdHMgPSAyKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpwbG90X2QyXzc5X3Njb3JlZF9hZF9kaWZmCmBgYAoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkluIGNvbnRyYXN0IHRvIGFuYWx5c2VzIG9mIGFkdWx0cywgYW1vbmcgY2hpbGRyZW4gaW4gU3R1ZHkgMiBkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9IRUFSVF8gc2NhbGVzIHdlcmUgbm90IGRpZmZlcmVudGlhYmxlIGZyb20gemVybyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLCBhbmQgdGhlIGRpcmVjdGlvbiBvZiBkaWZmZXJlbmNlIHZhcmllZCBzdWJzdGFudGlhbGx5IGFjcm9zcyB0YXJnZXQgY2hhcmFjdGVycyAoc2VlIHRoZSAiVGFyZ2V0IGNoYXJhY3RlciIgcm93IGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KS4gIAoKIyMjIyMgQk9EWSB2cy4gTUlORAoKQXMgYW1vbmcgYWR1bHRzLCBhbW9uZyBjaGlsZHJlbiBpbiBTdHVkeSAyIGRpZmZlcmVuY2Ugc2NvcmVzIGNvbXBhcmluZyBzY29yZXMgb24gdGhlIF9CT0RZXyBhbmQgX01JTkRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHksIGluIHRoZSBkaXJlY3Rpb24gb2YgY2hpbGRyZW4gZW5kb3JzaW5nIF9NSU5EXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0JPRFlfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJCT0RZLU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KSwgYW5kIHRoaXMgZGlmZmVyZW5jZSB3YXMgZXhhZ2dlcmF0ZWQgaW4gYXNzZXNzbWVudHMgb2YgdGhlIHJvYm90IChzZWUgdGhlICJUYXJnZXQgY2hhcmFjdGVyIiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQueCkuICAKCiMjIyMjIEhFQVJUIHZzLiBNSU5ECgpBcyBhbW9uZyBhZHVsdHMsIGFtb25nIGFkdWx0cyBpbiBTdHVkeSAyIGRpZmZlcmVuY2Ugc2NvcmVzIGNvbXBhcmluZyBzY29yZXMgb24gdGhlIF9IRUFSVF8gYW5kIF9NSU5EXyBzY2FsZXMgd2VyZSBzdWJzdGFudGlhbGx5IG5vbi16ZXJvLCBpbiB0aGUgZGlyZWN0aW9uIG9mIHBhcnRpY2lwYW50cyBlbmRvcnNpbmcgX01JTkRfIGl0ZW1zIG1vcmUgc3Ryb25nbHkgdGhhbiBfSEVBUlRfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQueCksIGFuZCB0aGlzIGRpZmZlcmVuY2Ugd2FzIGV4YWdnZXJhdGVkIGluIGFzc2Vzc21lbnRzIG9mIHRoZSByb2JvdChzZWUgdGhlICJUYXJnZXQgY2hhcmFjdGVyIiByb3cgZm9yIHRoZSAiSEVBUlQtTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLgoKIyMjIyMgSW50ZXJpbSBkaXNjdXNzaW9uCgpUaGVzZSBmb3JtYWwgYW5hbHlzZXMgb2YgZGlmZmVyZW5jZSBzY29yZXMgYWNyb3NzIHRoZSBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NhbGVzIGFtb25nIGNoaWxkcmVuIGluIFN0dWR5IDIgY29uZmlybSBteSBpbmZvcm1hbCBvYnNlcnZhdGlvbnMgdGhhdCBjaGlsZHJlbiBnZW5lcmFsbHkgc2hvd2VkIHNpbWlsYXIgcGF0dGVybnMgb2YgYXN5bW1ldHJpZXMgdG8gYWR1bHRz4oCUd2l0aCB0aGUgbm90YWJsZSBleGNlcHRpb24gb2YgdGhlIEJPRFkgdnMuIEhFQVJUIGNvbXBhcmlzaW9uLCBpbiB3aGljaCBjaGlsZHJlbidzIHJlc3BvbnNlcyByZXZlYWxlZCBubyBjb25zaXN0ZW50IGFzeW1tZXRyeS4gSW4gb3RoZXIgd29yZHMsIGNoaWxkcmVuLCBsaWtlIGFkdWx0cywgdGVuZGVkIHRvIGVuZG9yc2UgTUlORCBtb3JlIHN0cm9uZ2x5IHRoYW4gQk9EWSBvciBIRUFSVCwgYnV0IGRpZCBub3Qgc2hvdyBhIHJvYnVzdCBhZHVsdC1saWtlIHRlbmRlbmN5IHRvIGVuZG9yc2UgQk9EWSBtb3JlIHN0cm9uZ2x5IHRoYW4gSEVBUlQuIAoKYGBge3J9CnBsb3RzX2FnZWdwX2QyX3Njb3JlZF9hZCA8LSByZWx2aXpfYWdlZ3BfZnVuKAogIGRfc2NvcmVkID0gZDJfYWRfc2NvcmVkX2FkICU+JSAKICAgIGZ1bGxfam9pbihkMl83OV9zY29yZWRfYWQpLCAKICBhZ2VfZ3JvdXBzID0gYygiY2hpbGRyZW43OSIsICJhZHVsdHMiKSwKICBhZ2VfZ3JvdXBfbGFiZWxzID0gYygiQ2hpbGRyZW4gKDctOXkpIiwgIkFkdWx0cyIpLAogIGNvbG9ycyA9IGNvbG9yczAyKQpgYGAKCmBgYHtyfQpmaWdfZDJfYWxsX3Njb3JlZF9hZF9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfYWdlZ3BfZDJfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2FnZWdwX2QyX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19hZ2VncF9kMl9zY29yZWRfYWRbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQzEiLCAiQzIiLCAiQzMiKSwgbmNvbCA9IDMpCgpmaWdfZDJfYWxsX3Njb3JlZF9hZF9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19hZ2VncF9kMl9zY29yZWRfYWRbWzFdXSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgbmEudHJhbnNsYXRlID0gRiwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKCmZpZ19kMl9hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoCiAgZmlnX2QyX2FsbF9zY29yZWRfYWRfcGxvdHMsIGZpZ19kMl9hbGxfc2NvcmVkX2FkX2xlZywKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlnX2QyX2FsbF9zY29yZWRfYWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJUcmFja2luZyBkZXZlbG9wbWVudCBiZXR3ZWVuIDctOXkgYW5kIGFkdWx0aG9vZCAoc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDJfYWxsX3Njb3JlZF9hZF9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKAogIGZpZ19kMl9hbGxfc2NvcmVkX2FkX3RpdGxlLCBmaWdfZDJfYWxsX3Njb3JlZF9hZF9wbG90c19sZWcsCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7cn0KZmlndXJlNC54IDwtIHBsb3RfZ3JpZChmaWdfZDJfYWRfcGxvdHNfbGVnX3RpdGxlLCAKICAgICAgICAgICAgICAgICAgICAgICBmaWdfZDJfNzlfcGxvdHNfbGVnX3RpdGxlLAogICAgICAgICAgICAgICAgICAgICAgIGZpZ19kMl9hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZ190aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSkKCmZpZ3VyZTQueF9jYXAgPC0gYWRkX3N1YihmaWd1cmU0LngsIHN0cl93cmFwKCJGaWd1cmUgNC54OiBSZWxhdGlvbnNoaXBzIGFtb25nIFVTIGFkdWx0cycsIG9sZGVyIGNoaWxkcmVuJ3MsIGFuZCB5b3VuZ2VyIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZHkgMiwgc2NvcmVkIHVzaW5nIGFkdWx0cycgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIHNjYWxlcyAoc2VlIFRhYmxlIDQueCkuIFBsb3RzIGFyZSBvcmdhbml6ZWQgYnkgc2FtcGxlIChyb3dzKSBhbmQgYnkgcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChjb2x1bW5zKS4gKEEpIEFkdWx0cy4gKEIpIENoaWxkcmVuICg3LTl5IG9mIGFnZSksIHNjb3JlZCB1c2luZyBhZHVsdHMnIHNjYWxlcy4gKEMpIEEgdmlzdWFsaXphdGlvbiBvZiBkZXZlbG9wbWVudCBiZXR3ZWVuIDctOXkgYW5kIGFkdWx0aG9vZCwgdXNpbmcgbWVhbiBzY29yZXMgYnkgY2hhcmFjdGVyIGFuZCBhZ2UgZ3JvdXAuIEZvciBlYWNoIGNvbmNlcHR1YWwgdW5pdCwgc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gMC0xLiBJbiBwYW5lbHMgQS1CLCBpbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBhcmUgcGxvdHRlZCBhcyBzbWFsbCwgdHJhbnNsdWNlbnQgY2lyY2xlcywgYW5kIG1lYW4gc2NvcmVzIGJ5IGNoYXJhY3RlciBhcmUgcGxvdHRlZCBhcyBsYXJnZXIsIHNvbGlkIGRpYW1vbmRzLiBFcnJvciBiYXJzIGFyZSA5NSUgYm9vdHN0cmFwcGVkIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBUaGUgZG90dGVkIGxpbmUgY29ycmVzcG9uZHMgdG8gZXF1YWwgZW5kb3JzZW1lbnRzIG9mIHRoZSB0d28gY29uY2VwdHVhbCB1bml0cyBwbG90dGVkLiIsIDExMCksIHggPSAwLCBoanVzdCA9IDApCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMS40fQpnZ2RyYXcoZmlndXJlNC54X2NhcCkKYGBgCgojIyMgRGV2ZWxvcG1lbnRhbCBjb21wYXJpc29uCgpJbiB0aGUgcHJldmlvdXMgc2VjdGlvbnMsIEkgYW5hbHl6ZWQgYWR1bHRzJyBhbmQgY2hpbGRyZW4ncyByZXNwb25zZXMgc2VwYXJhdGVseS4gSGVyZSBJIGNvbmR1Y3QgYSBmb3JtYWwgY29tcGFyaXNvbiBvZiBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIGNvbmNlcHR1YWwgdW5pdHMgYW1vbmcgdGhlc2UgdHdvIGFnZSBncm91cHMsIHRvIGFzc2VzcyB0aGUgc2l6ZSBhbmQgcm9idXN0bmVzcyBvZiB0aGVzZSBvc3RlbnNpdmUgZGV2ZWxvcG1lbnRhbCBkaWZmZXJlbmNlcy4KCmBgYHtyfQpkMl9hZDc5X3Njb3JlZF9hZF9kaWZmIDwtIGZ1bGxfam9pbihkMl9hZF9zY29yZWRfYWRfZGlmZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDJfNzlfc2NvcmVkX2FkX2RpZmYpICU+JQogIG11dGF0ZShhZ2VfZ3JvdXAgPSBmYWN0b3IoYWdlX2dyb3VwKSkKY29udHJhc3RzKGQyX2FkNzlfc2NvcmVkX2FkX2RpZmYkY2hhcmFjdGVyKSA8LSBjb250cmFzdHNfc3VtX2VkZ2UKY29udHJhc3RzKGQyX2FkNzlfc2NvcmVkX2FkX2RpZmYkYWdlX2dyb3VwKSA8LSBjb250cmFzdHNfZHVtMl9hZ2VncApgYGAKCmBgYHtyfQojIHJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyICogYWdlX2dyb3VwLAojICAgZGF0YSA9IGQyX2FkNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwgCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpyX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpzdW1tYXJ5KHJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUKQpgYGAKCmBgYHtyfQojIHJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKiBhZ2VfZ3JvdXAsCiMgICBkYXRhID0gZDJfYWQ3OV9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksIAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyX2FkNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpzdW1tYXJ5KHJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKiBhZ2VfZ3JvdXAsCiMgICBkYXRhID0gZDJfYWQ3OV9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLCAKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnN1bW1hcnkocl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpCmBgYAoKYGBge3J9CnJlZ3RhYl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfcmVnX3RhYmxlX2Z1bigKICByZWdfbGlzdCA9IGxpc3Qocl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiAgICAgICAgICAgICAgICAgIHJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiAgICAgICAgICAgICAgICAgIHJfZDJfYWQ3OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKSwKICBwYWlyX2xpc3QgPSBjKCJCT0RZIC0gSEVBUlQiLCAiQk9EWSAtIE1JTkQiLCAiSEVBUlQgLSBNSU5EIiksCiAgc3R1ZHlfbmFtZSA9ICJEZXZlbG9wbWVudGFsIGNvbXBhcmlzb24iLAogIGNoYXJfbGFiZWwgPSAiUm9ib3QgdnMuIEdNIiwgCiAgYWdlZ3BfbGFiZWwgPSAiQ2hpbGRyZW4gdnMuIGFkdWx0cyIpCmBgYAoKYGBge3J9CiMgaW50ZXJpbSB0YWJsZSBmb3IgZWFzZSBvZiB3cml0aW5nCnJlZ3RhYl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmICU+JQogIHNlbGVjdCgtc3R1ZHksIC1zLmUuKSAlPiUKICBmaWx0ZXIocGFyYW0gJWluJSBjKCJDaGlsZHJlbiB2cy4gYWR1bHRzIiwgIkludGVyYWN0aW9uIikpICU+JQogIGthYmxlKGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCnBsb3RfZ3JpZChwbG90X2QyX2FkX3Njb3JlZF9hZF9kaWZmLCBwbG90X2QyXzc5X3Njb3JlZF9hZF9kaWZmLCBuY29sID0gMikKYGBgCgojIyMjIyBCT0RZIHZzLiBIRUFSVAoKRGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiB0aGUgX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgY2xvc2VyIHRvIHplcm8gYW1vbmcgY2hpbGRyZW4sIGFzIGNvbXBhcmVkIHRvIGFkdWx0cyAoc2VlIHRoZSAiQ2hpbGRyZW4gdnMuIGFkdWx0cyIgcm93IGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KS4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycyBkaWQgbm90IGRpZmZlciBzdWJzdGFudGlhbGx5IGFjcm9zcyBhZ2UgZ3JvdXBzIChzZWUgdGhlICJJbnRlcmFjdGlvbiIgcm93IGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KS4gIAoKIyMjIyMgQk9EWSB2cy4gTUlORAoKRGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzIHdlcmUgc3Vic3RhbnRpYWxseSBjbG9zZXIgdG8gemVybyBhbW9uZyBjaGlsZHJlbiwgYXMgY29tcGFyZWQgdG8gYWR1bHRzIChzZWUgdGhlICJDaGlsZHJlbiB2cy4gYWR1bHRzIiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQueCksIGFuZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzIHdhcyBhdHRlbnVhdGVkIGFtb25nIGNoaWxkcmVuIChzZWUgdGhlICJJbnRlcmFjdGlvbiIgcm93IGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLiAgCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKRGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiB0aGUgX0hFQVJUXyBhbmQgX01JTkRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgY2xvc2VyIHRvIHplcm8gYW1vbmcgY2hpbGRyZW4sIGFzIGNvbXBhcmVkIHRvIGFkdWx0cyAoc2VlIHRoZSAiQ2hpbGRyZW4gdnMuIGFkdWx0cyIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KSwgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycyBkaWQgbm90IGRpZmZlciBzdWJzdGFudGlhbGx5IGFjcm9zcyBhZ2UgZ3JvdXBzIChzZWUgdGhlICJJbnRlcmFjdGlvbiIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KS4gIAoKIyMjIyMgSW50ZXJpbSBkaXNjdXNzaW9uCgpUaGVzZSBmb3JtYWwgY29tcGFyaXNvbnMgb2YgZGlmZmVyZW5jZSBzY29yZXMgYW1vbmcgY2hpbGRyZW4gdnMuIGFkdWx0cyBpbiBTdHVkeSAyIGNvbmZpcm0gbXkgZWFybGllciBvYnNlcnZhdGlvbnMgdGhhdCBhc3ltbWV0cmllcyB3ZXJlIHN1YnN0YW50aWFsbHkgYXR0ZW51YXRlZCAoYW5kIGluIHNvbWUgY2FzZXMsIHJlZHVjZWQgdG8gemVybykgYW1vbmcgY2hpbGRyZW4sIHJlbGF0aXZlIHRvIHRoZSBiYXNlbGluZSBzZXQgYnkgYWR1bHRzLiBJbiBhZGRpdGlvbiwgYW1vbmcgY2hpbGRyZW4gdGhlIGRpZmZlcmVuY2VzIGluIHRoZXNlIGFzeW1tZXRyaWVzIGJldHdlZW4gdGhlIHR3byAiZWRnZSBjYXNlcyIgaW5jbHVkZWQgaW4gdGhpcyBzdHVkeSAodGhlIGJlZXRsZSB2cy4gdGhlIHJvYm90KSB3ZXJlIGFsc28gYXR0ZW51YXRlZCwgcmVsYXRpdmUgdG8gYWR1bHRzOyB0aGlzIGlzIGluIGxpbmUgd2l0aCBteSBlYXJsaWVyLCBpbmZvcm1hbCBvYnNlcnZhdGlvbnMgdGhhdCB0aGVzZSBhc3ltbWV0cmllcyBzb21ldGltZXMgYXBwZWFyZWQgdG8gcmV2ZXJzZSBpbiBkaXJlY3Rpb24gYWNyb3NzIHRoZSB0d28gdGFyZ2V0IGNoYXJhY3RlcnMuIAoKIyMjIENoaWxkcmVuICg3LTl5KSwgdXNpbmcgY2hpbGRyZW4ncyBvd24gc2NhbGVzCgpYWCBfX0lOU0VSVCBUUkFOU0lUSU9OX18KCiMjIyMgU2NhbGUgY29uc3RydWN0aW9uCgpgYGB7cn0Kc2NhbGVzX2VmYV93ZG1fZDJfNzkgPC0gc2NhbGVfZnVuKGVmYV93ZG1fZDJfNzksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2VmYV93ZG1fZDJfNzkpCmQyXzc5X3Njb3JlZF83OSA8LSBzY29yZV9mdW4oZDJfNzksIHNjYWxlc19lZmFfd2RtX2QyXzc5KQoKc2F2ZVJEUyhzY2FsZXNfZWZhX3dkbV9kMl83OSwgZmlsZSA9ICIuL3N0b3JlZC9zY2FsZXMvc2NhbGVzX2VmYV93ZG1fZDJfNzkiKQpzYXZlUkRTKGQyXzc5X3Njb3JlZF83OSwgZmlsZSA9ICIuL3N0b3JlZC9zY29yZWRfZGF0YS9kMl83OV9zY29yZWRfNzkiKQpgYGAKCmBgYHtyfQpzY2FsZXNfc3R1ZHkyIDwtIGJpbmRfcm93cyhzY2FsZXNfZWZhX3dkbV9kMl9hZCAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHN0dWR5ID0gIkFkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXNfZWZhX3dkbV9kMl83OSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHN0dWR5ID0gIkNoaWxkcmVuLCA3LTl5IikpICU+JQogIHNlbGVjdCgtYyhsb2FkaW5nLCBvcmRlcikpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgc3ByZWFkKHN0dWR5LCBmYWN0b3IpICU+JQogIG11dGF0ZSh1cl9mYWN0b3IgPSBpZmVsc2UoIWlzLm5hKGBBZHVsdHNgKSwgYEFkdWx0c2AsIGBDaGlsZHJlbiwgNy05eWApKSAlPiUKICBsZWZ0X2pvaW4oc2NhbGVzX2VmYV93ZG1fZDJfYWQgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgb3JkZXIpICU+JSByZW5hbWUob3JkZXJfYWQgPSBvcmRlcikpICU+JQogIGxlZnRfam9pbihzY2FsZXNfZWZhX3dkbV9kMl83OSAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KGNhcGFjaXR5LCBvcmRlcikgJT4lIHJlbmFtZShvcmRlcl83OSA9IG9yZGVyKSkgJT4lCiAgYXJyYW5nZSh1cl9mYWN0b3IsIG9yZGVyX2FkLCBvcmRlcl83OSkgJT4lCiAgc2VsZWN0KC11cl9mYWN0b3IpICMgJT4lCiMgc2VsZWN0KC1zdGFydHNfd2l0aCgib3JkZXIiKSkKYGBgCgpgYGB7cn0KIyBiaWcgdGFibGUgZm9yIHNjYWxlcyBsb2NhdGVkIGF0IHN0dWR5IDQKYGBgCgpGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiAiR2VuZXJhbCBhbmFseXNpcyBwbGFuLCIgYWJvdmUsIHlpZWxkZWQgYHIgZmFjdF9uYW1lX2Z1bihmYWN0b3JfbmFtZXNfZWZhX3dkbV9kMl83OSlgIHNjYWxlcyBvZiBgciBzY2FsZXNfZWZhX3dkbV9kMl83OSAlPiUgY291bnQoZmFjdG9yKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG4pKSAlPiUgc2VsZWN0KG1lYW4pICU+JSBhcy5udW1lcmljKClgIGl0ZW1zIGVhY2g7IHNlZSBUYWJsZSA0LnguCgojIyMjIFZpc3VhbGl6YXRpb24KCmBgYHtyfQpwbG90c19kMl83OV9zY29yZWRfNzkgPC0gcmVsdml6X2Z1bihkMl83OV9zY29yZWRfNzkpCmBgYAoKYGBge3J9CmZpZ19kMl83OV9zY29yZWRfNzlfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2QyXzc5X3Njb3JlZF83OVtbMV1dICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kMl83OV9zY29yZWRfNzlbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QyXzc5X3Njb3JlZF83OVtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQTEiLCAiQTIiLCAiQTMiKSwgbmNvbCA9IDMpCgpmaWdfZDJfNzlfc2NvcmVkXzc5X2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2QyXzc5X3Njb3JlZF83OVtbMV1dICsgCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKCmZpZ19kMl83OV9zY29yZWRfNzlfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWdfZDJfNzlfc2NvcmVkXzc5X3Bsb3RzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19kMl83OV9zY29yZWRfNzlfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kMl83OV9zY29yZWRfNzlfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAyOiBDaGlsZHJlbiwgNy05eSAoc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMpIiwgc2l6ZSA9IDE2LCBmb250ZmFjZSA9ICdib2xkJywgeCA9IDAsIGhqdXN0ID0gMCkKCmZpZ19kMl83OV9zY29yZWRfNzlfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDJfNzlfc2NvcmVkXzc5X3RpdGxlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19kMl83OV9zY29yZWRfNzlfcGxvdHNfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpmaWdfZDJfNzlfc2NvcmVkXzc5X3Bsb3RzX2xlZ190aXRsZQpgYGAKClZpc3VhbGl6YXRpb25zIG9mIHJlbGF0aW9uc2hpcHMgYW1vbmcgc2NvcmVzIG9uIHRoZXNlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYXJlIHByb3ZpZGVkIGluIEZpZ3VyZSA0LngsIHJvdyBCLgoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkZpcnN0IEkgd2lsbCBjb25zaWRlciB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQk9EWSBhbmQgSEVBUlQgKEZpZ3VyZSA0LngsIHBhbmVsIEIxKS4gQXMgYW1vbmcgYWR1bHRzIGluIHRoaXMgc3R1ZHkgKHBhbmVsIEExKSwgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlcyBhcHBlYXJzIHRvIGJlIHNvbWV3aGF0IHBvc2l0aXZlLCBhbmQgdGhlcmUgYXBwZWFyIHRvIGJlIHNvbWV3aGF0IGZld2VyIGRhdGFwb2ludHMgYWJvdmUgdGhlIGxpbmUgb2YgZXF1aXZhbGVuY2UgKCR5ID0geCQsIGRvdHRlZCBkaWFnb25hbCBsaW5lKSB0aGFuIGJlbG93IGl04oCUYnV0IGJvdGggb2YgdGhlc2Ugb2JzZXJ2YXRpb25zIGFyZSBtdWNoIGxlc3Mgc3RyaWtpbmcgYW1vbmcgY2hpbGRyZW4gdGhhbiB0aGV5IHdlcmUgYW1vbmcgYWR1bHRzLiBJbiBvdGhlciB3b3Jkcywgd2hpbGUgbWFueSBjaGlsZHJlbiBhdHRyaWJ1dGVkIG1vcmUgQk9EWSB0aGFuIEhFQVJUIHRvIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGluIHF1ZXN0aW9uIChsaWtlIHRoZSB2YXN0IG1ham9yaXR5IG9mIGFkdWx0cyksIHF1aXRlIGEgZmV3IGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBIRUFSVCB0aGFuIEJPRFkuIEZ1cnRoZXJtb3JlLCBhIHZpc3VhbCBpbnNwZWN0aW9uIG9mIHRoaXMgcGxvdCBzdWdnZXN0cyB0aGF0IHRoZSBhc3ltbWV0cnkgbWF5IGhhdmUgZXZlbiBnb25lIGluIG9wcG9zaXRlIGRpcmVjdGlvbnMgZm9yIHRoZSB0d28gdGFyZ2V0IGNoYXJhY3RlcnMsIHdpdGggY2hpbGRyZW4gdGVuZGluZyB0byBhdHRyaWJ1dGUgbW9yZSBCT0RZIHRoYW4gSEVBUlQgdG8gdGhlIGJlZXRsZSAoaW4gcmVkKSBidXQsIGlmIGFueXRoaW5nLCBtb3JlIEhFQVJUIHRoYW4gQk9EWSB0byB0aGUgcm9ib3QgKGluIGJsdWUpLgoKIyMjIyMgQk9EWSB2cy4gTUlORAoKTmV4dCBJIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJPRFkgYW5kIE1JTkQgKEZpZ3VyZSA0LngsIHBhbmVsIEIyKS4gQXMgYW1vbmcgYWR1bHRzIGluIHRoaXMgc3R1ZHkgKHBhbmVsIEEyKSwgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzIGFwcGVhcnMgdG8gYmUgc29tZXdoYXQgcG9zaXRpdmUsIGFuZCB0aGVyZSBhcHBlYXIgdG8gYmUgc29tZXdoYXQgZmV3ZXIgZGF0YXBvaW50cyBiZWxvdyB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpIHRoYW4gYWJvdmUgaXTigJRidXQsIGFzIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCBib3RoIG9mIHRoZXNlIG9ic2VydmF0aW9ucyBhcmUgbXVjaCBsZXNzIHN0cmlraW5nIGFtb25nIGNoaWxkcmVuIHRoYW4gdGhleSB3ZXJlIGFtb25nIGFkdWx0cy4gSW4gb3RoZXIgd29yZHMsIHdoaWxlIG1hbnkgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIE1JTkQgdGhhbiBCT0RZIHRvIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGluIHF1ZXN0aW9uIChsaWtlIHRoZSB2YXN0IG1ham9yaXR5IG9mIGFkdWx0cyksIHF1aXRlIGEgZmV3IGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBCT0RZIHRoYW4gTUlORC4gRnVydGhlcm1vcmUsIGEgdmlzdWFsIGluc3BlY3Rpb24gb2YgdGhpcyBwbG90IHN1Z2dlc3RzIHRoYXQgdGhlIGFzeW1tZXRyeSBtYXkgaGF2ZSBldmVuIGdvbmUgaW4gb3Bwb3NpdGUgZGlyZWN0aW9ucyBmb3IgdGhlIHR3byB0YXJnZXQgY2hhcmFjdGVycywgd2l0aCBjaGlsZHJlbiB0ZW5kaW5nIHRvIGF0dHJpYnV0ZSBtb3JlIE1JTkQgdGhhbiBCT0RZIHRvIHRoZSByb2JvdCAoaW4gYmx1ZSkgYnV0LCBpZiBhbnl0aGluZywgbW9yZSBCT0RZIHRoYW4gTUlORCB0byB0aGUgYmVldGxlIChpbiByZWQpLgoKIyMjIyMgSEVBUlQgdnMuIE1JTkQKCkZpbmFsbHkgSSB3aWxsIGNvbnNpZGVyIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBIRUFSVCBhbmQgTUlORCAoRmlndXJlIDQueCwgcGFuZWwgQjMpLiBBcyBhbW9uZyBhZHVsdHMgaW4gdGhpcyBzdHVkeSAocGFuZWwgQTMpLCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfSEVBUlRfIGFuZCBfTUlORF8gc2NhbGVzIGFwcGVhcnMgdG8gYmUgc29tZXdoYXQgcG9zaXRpdmUsIGFuZCB0aGVyZSBhcHBlYXIgdG8gYmUgc29tZXdoYXQgZmV3ZXIgZGF0YXBvaW50cyBiZWxvdyB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpIHRoYW4gYWJvdmUgaXTigJRidXQsIGFzIGluIHRoZSBwcmV2aW91cyBzZWN0aW9ucywgYm90aCBvZiB0aGVzZSBvYnNlcnZhdGlvbnMgYXJlIG11Y2ggbGVzcyBzdHJpa2luZyBhbW9uZyBjaGlsZHJlbiB0aGFuIHRoZXkgd2VyZSBhbW9uZyBhZHVsdHMuIEluIG90aGVyIHdvcmRzLCB3aGlsZSBtYW55IGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBNSU5EIHRoYW4gSEVBUlQgdG8gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24gKGxpa2UgdGhlIHZhc3QgbWFqb3JpdHkgb2YgYWR1bHRzKSwgcXVpdGUgYSBmZXcgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIEhFQVJUIHRoYW4gTUlORC4gVGhpcyBhcHBlYXJzIHRvIGhhdmUgYmVlbiB0cnVlIGZvciBib3RoIHRhcmdldCBjaGFyYWN0ZXJzLgoKIyMjIyMgSW50ZXJpbSBkaXNjdXNzaW9uCgpNeSBpbmZvcm1hbCBvYnNlcnZhdGlvbnMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgY2hpbHJkZW4ncyBlbmRvcnNlbWVudHMgb2YgdGhlIHRoZSBjb25jZXB0dWFsIHVuaXRzIGluIFN0dWR5IDIgYXJlIGdlbmVyYWxseSBzaW1pbGFyIHRvIHRob3NlIG9mIGFkdWx0cyBpbiB0aGlzIHN0dWR5LCBidXQgZHJhbWF0aWNhbGx5IGF0dGVudWF0ZWQ6ICgxKSBBbGwgb2YgdGhlc2UgaW50ZXItdW5pdCByZWxhdGlvbnNoaXBzIHdlcmUgc29tZXdhaHQgcG9zaXRpdmUsIGJ1dCBvbmx5IHNvbWV3aGF0OyBhbmQgKDIpIFRoZXJlIHdhcyBzb21lIGV2aWRlbmNlIG9mIGFzeW1tZXRyaWVzIGluIHRoZXNlIHBvc2l0aXZlIHJlbGF0aW9uc2hpcHMsIGJ1dCB0aGVzZSBhc3ltbWV0cmllcyB3ZXJlIGdlbmVyYWxseSB3ZWFrZXIgYW5kIGFwcGVhcmVkIHRvIGJlIGhpZ2hseSBkZXBlbmRlbnQgb24gd2hpY2ggdGFyZ2V0IGNoYXJhY3RlciBwYXJ0aWNpcGFudHMgYXNzZXNzZWQgKHBhcnRpY3VsYXJseSBmb3IgdGhlIEJPRFkgdnMuIEhFQVJUIGFuZCBCT0RZIHZzLiBNSU5EIGNvbXBhcmlzb25zKS4KCmBgYHtyfQpmaWd1cmU0LnggPC0gcGxvdF9ncmlkKGZpZ19kMl83OV9zY29yZWRfNzlfcGxvdHNfbGVnX3RpdGxlLCAKICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSkKCmZpZ3VyZTQueF9jYXAgPC0gYWRkX3N1YihmaWd1cmU0LngsIHN0cl93cmFwKCJGaWd1cmUgNC54OiBSZWxhdGlvbnNoaXBzIGFtb25nIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZHkgMiwgc2NvcmVkIHVzaW5nIHRoZWlyIG93biBzY2FsZXMgKHNlZSBUYWJsZSA0LngpLiBQbG90cyBhcmUgb3JnYW5pemVkIGJ5IHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cyAoY29sdW1ucykuIEZvciBlYWNoIGNvbmNlcHR1YWwgdW5pdCwgc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gMC0xLiBJbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBhcmUgcGxvdHRlZCBhcyBzbWFsbCwgdHJhbnNsdWNlbnQgY2lyY2xlcywgYW5kIG1lYW4gc2NvcmVzIGJ5IGNoYXJhY3RlciBhcmUgcGxvdHRlZCBhcyBsYXJnZXIsIHNvbGlkIGRpYW1vbmRzLiBFcnJvciBiYXJzIGFyZSA5NSUgYm9vdHN0cmFwcGVkIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBUaGUgZG90dGVkIGxpbmUgY29ycmVzcG9uZHMgdG8gZXF1YWwgZW5kb3JzZW1lbnRzIG9mIHRoZSB0d28gY29uY2VwdHVhbCB1bml0cyBwbG90dGVkLiIsIDExMCksIHggPSAwLCBoanVzdCA9IDApCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC41fQpnZ2RyYXcoZmlndXJlNC54X2NhcCkKYGBgCgojIyMjIEFuYWx5c2lzIG9mIGFzeW1tZXRyaWVzCgpIZXJlIEkgcHJvdmlkZSBhIGZvcm1hbCBhbmFseXNpcyBvZiB0aGUgYXN5bW1ldHJpZXMgcmV2ZWFsZWQgYnkgdGhlIHZpc3VhbGl6YXRpb25zIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLiBBcyBpbiBwcmV2aW91cyBhbmFseXNlcywgZm9yIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChCT0RZIHZzLiBIRUFSVCwgQk9EWSB2cy4gTUlORCwgYW5kIEhFQVJUIHZzLiBNSU5EKSwgSSB1c2VkIEJheWVzaWFuIHJlZ3Jlc3Npb24gdG8gY29tcGFyZSBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIHRoZXNlIHR3byBjb25jZXB0dWFsIHVuaXRzIHRvIHplcm8sIGNvbnRyb2xsaW5nIGZvciBkaWZmZXJlbmNlcyBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgdHdvICJlZGdlIGNhc2VzIiB0aGF0IHdlcmUgZmVhdHVyZWQgYXMgdGFyZ2V0IGNoYXJhY3RlcnMgaW4gdGhlc2Ugc3R1ZGllcyAoYmVldGxlIGFuZCByb2JvdCkuIFNlZSBGaWd1cmUgNC5YWCwgcGFuZWwgQiwgZm9yIHZpc3VhbCBkZXBpY3Rpb25zIG9mIHRoZXNlIGRpZmZlcmVuY2Ugc2NvcmVzLgoKYGBge3J9CmQyXzc5X3Njb3JlZF83OV9kaWZmIDwtIGRpZmZfZnVuKGQyXzc5X3Njb3JlZF83OSkKY29udHJhc3RzKGQyXzc5X3Njb3JlZF83OV9kaWZmJGNoYXJhY3RlcikgPC0gY29udHJhc3RzX3N1bV9lZGdlCgpzYXZlUkRTKGQyXzc5X3Njb3JlZF83OV9kaWZmLCAiLi9zdG9yZWQvZGlmZnNjb3JlX2RhdGEvZDJfNzlfc2NvcmVkXzc5X2RpZmYiKQpgYGAKCmBgYHtyfQpwbG90X2QyXzc5X3Njb3JlZF83OV9kaWZmIDwtIGRpZmZwbG90X2Z1bihkMl83OV9zY29yZWRfNzlfZGlmZikKYGBgCgpgYGB7cn0KIyByX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfSEVBUlQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDJfNzlfc2NvcmVkXzc5X2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDJfNzlfc2NvcmVkXzc5X2RpZmZfQk9EWV9IRUFSVCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfSEVBUlQiKQoKcl9kMl83OV9zY29yZWRfNzlfZGlmZl9CT0RZX0hFQVJUIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDJfNzlfc2NvcmVkXzc5X2RpZmZfQk9EWV9IRUFSVCIpCgpzdW1tYXJ5KHJfZDJfNzlfc2NvcmVkXzc5X2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkMl83OV9zY29yZWRfNzlfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfTUlORCIpCgpyX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfTUlORCIpCgpzdW1tYXJ5KHJfZDJfNzlfc2NvcmVkXzc5X2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDJfNzlfc2NvcmVkXzc5X2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkMl83OV9zY29yZWRfNzlfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kMl83OV9zY29yZWRfNzlfZGlmZl9IRUFSVF9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDJfNzlfc2NvcmVkXzc5X2RpZmZfSEVBUlRfTUlORCIpCgpyX2QyXzc5X3Njb3JlZF83OV9kaWZmX0hFQVJUX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kMl83OV9zY29yZWRfNzlfZGlmZl9IRUFSVF9NSU5EIikKCnN1bW1hcnkocl9kMl83OV9zY29yZWRfNzlfZGlmZl9IRUFSVF9NSU5EKQpgYGAKCmBgYHtyfQpyZWd0YWJfZDJfNzlfc2NvcmVkXzc5X2RpZmYgPC0gZGlmZl9yZWdfdGFibGVfZnVuKAogIHJlZ19saXN0ID0gbGlzdChyX2QyXzc5X3Njb3JlZF83OV9kaWZmX0JPRFlfSEVBUlQsCiAgICAgICAgICAgICAgICAgIHJfZDJfNzlfc2NvcmVkXzc5X2RpZmZfQk9EWV9NSU5ELAogICAgICAgICAgICAgICAgICByX2QyXzc5X3Njb3JlZF83OV9kaWZmX0hFQVJUX01JTkQpLAogIHBhaXJfbGlzdCA9IGMoIkJPRFkgLSBIRUFSVCIsICJCT0RZIC0gTUlORCIsICJIRUFSVCAtIE1JTkQiKSwKICBzdHVkeV9uYW1lID0gIkNoaWxkcmVuLCA3LTl5ICh1c2luZyB0aGVpciBvd24gc2NhbGVzKSIsCiAgY2hhcl9sYWJlbCA9ICJSb2JvdCB2cy4gR00iKQpgYGAKCmBgYHtyfQojIGludGVyaW0gdGFibGUgZm9yIGVhc2Ugb2Ygd3JpdGluZwpyZWd0YWJfZDJfNzlfc2NvcmVkXzc5X2RpZmYgJT4lCiAgc2VsZWN0KC1zdHVkeSwgLXMuZS4pICU+JQogIGZpbHRlcihwYXJhbSA9PSAiSW50ZXJjZXB0IikgJT4lCiAga2FibGUoZGlnaXRzID0gMikgJT4lCiAga2FibGVfc3R5bGluZygpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKcGxvdF9kMl83OV9zY29yZWRfNzlfZGlmZgpgYGAKCiMjIyMjIEJPRFkgdnMuIEhFQVJUCgpBcyBpbiBhbmFseXNlcyB1c2luZyBhZHVsdHMnIHNjYWxlcywgdXNpbmcgY2hpbGRyZW4ncyBvd24gX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlcyB0byBhbmFseXplIHRoZWlyIGRhdGEgcmV2ZWFsZWQgdGhhdCBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIHRoZXNlIGNvbmNlcHR1YWwgdW5pdHMgd2VyZSBub3QgZGlmZmVyZW50aWFibGUgZnJvbSB6ZXJvIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJCT0RZLUhFQVJUIiBjb21wYXJpc29uIGluIFRhYmxlIDQueCksIGFuZCB0aGUgZGlyZWN0aW9uIG9mIGRpZmZlcmVuY2UgdmFyaWVkIHN1YnN0YW50aWFsbHkgYWNyb3NzIHRhcmdldCBjaGFyYWN0ZXJzIChzZWUgdGhlICJUYXJnZXQgY2hhcmFjdGVyIiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLiAgCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpBcyBpbiBhbmFseXNlcyB1c2luZyBhZHVsdHMnIHNjYWxlcywgdXNpbmcgY2hpbGRyZW4ncyBvd24gX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzIHRvIGFuYWx5emUgdGhlaXIgZGF0YSByZXZlYWxlZCB0aGF0IGRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gdGhlc2UgY29uY2VwdHVhbCB1bml0cyBzdWJzdGFudGlhbGx5IG5vbi16ZXJvLCBpbiB0aGUgZGlyZWN0aW9uIG9mIGNoaWxkcmVuIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9CT0RZXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQueCksIGFuZCB0aGlzIGRpZmZlcmVuY2Ugd2FzIGV4YWdnZXJhdGVkIGluIGFzc2Vzc21lbnRzIG9mIHRoZSByb2JvdCAoc2VlIHRoZSAiVGFyZ2V0IGNoYXJhY3RlciIgcm93IGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLiAgCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKQXMgaW4gYW5hbHlzZXMgdXNpbmcgYWR1bHRzJyBzY2FsZXMsIHVzaW5nIGNoaWxkcmVuJ3Mgb3duIF9IRUFSVF8gYW5kIF9NSU5EXyBzY2FsZXMgdG8gYW5hbHl6ZSB0aGVpciBkYXRhIHJldmVhbGVkIHRoYXQgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiB0aGVzZSBjb25jZXB0dWFsIHVuaXRzIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgY2hpbGRyZW4gZW5kb3JzaW5nIF9NSU5EXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0hFQVJUXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiSEVBUlQtTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLCBhbmQgdGhpcyBkaWZmZXJlbmNlIHdhcyBleGFnZ2VyYXRlZCBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgcm9ib3QgKHNlZSB0aGUgIlRhcmdldCBjaGFyYWN0ZXIiIHJvdyBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQueCkuICAKCiMjIyMjIEludGVyaW0gZGlzY3Vzc2lvbgoKVXNpbmcgY2hpbGRyZW4ncyBvd24gX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjYWxlcyB0byBhc3Nlc3MgYXN5bW1ldHJpZXMgaW4gdGhlaXIgZW5kb3JzZW1lbnRzIG9mIHRoZXNlIGNvbmNlcHR1YWwgdW5pdHMgcmV2ZWFsZWQgdGhlIHNhbWUgcGF0dGVybiBvZiByZXN1bHRzIG9idGFpbmVkIHdoZW4gdXNpbmcgYWR1bHRzJyBzY2FsZXM6IENoaWxkcmVuIGdlbmVyYWxseSBzaG93ZWQgc2ltaWxhciBwYXR0ZXJucyBvZiBhc3ltbWV0cmllcyB0byBhZHVsdHMsIHdpdGggdGhlIG5vdGFibGUgZXhjZXB0aW9uIG9mIHRoZSBCT0RZIHZzLiBIRUFSVCBjb21wYXJpc2lvbiwgaW4gd2hpY2ggY2hpbGRyZW4ncyByZXNwb25zZXMgcmV2ZWFsZWQgbm8gY29uc2lzdGVudCBhc3ltbWV0cnkuIEluIG90aGVyIHdvcmRzLCBjaGlsZHJlbiwgbGlrZSBhZHVsdHMsIHRlbmRlZCB0byBlbmRvcnNlIE1JTkQgbW9yZSBzdHJvbmdseSB0aGFuIEJPRFkgb3IgSEVBUlQsIGJ1dCBkaWQgbm90IHNob3cgYSByb2J1c3QgYWR1bHQtbGlrZSB0ZW5kZW5jeSB0byBlbmRvcnNlIEJPRFkgbW9yZSBzdHJvbmdseSB0aGFuIEhFQVJU4oCUcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXNlIGNvbmNlcHR1YWwgdW5pdHMgd2VyZSBpbmRleGVkIGJ5IHNjYWxlcyBkZXNpZ25lZCB0byBjYXB0dXJlIGFkdWx0cycgb3IgY2hpbGRyZW4ncyBjb25zdHJ1YWxzIG9mIEJPRFksIEhFQVJULCBhbmQgTUlORC4gCgpgYGB7cn0KZmlndXJlNC54X3Bsb3RzIDwtIHBsb3RfZ3JpZCgKICBwbG90X2QyX2FkX3Njb3JlZF9hZF9kaWZmICsKICAgIGxhYnModGl0bGUgPSAiU3R1ZHkgMjogQWR1bHRzIikgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpLAogIHBsb3RfZDJfNzlfc2NvcmVkX2FkX2RpZmYgKwogICAgbGFicyh0aXRsZSA9ICJTdHVkeSAyOiBDaGlsZHJlbiwgNy05eSAoc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzKSIpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSwKICBwbG90X2QyXzc5X3Njb3JlZF83OV9kaWZmICsgCiAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDI6IENoaWxkcmVuLCA0LTZ5IChzY29yZWQgdXNpbmcgdGhlaXIgb3duIHNjYWxlcykiKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiksIAogIG5jb2wgPSAzLCByZWxfd2lkdGhzID0gYygxLCAxLCAxKSwKICBsYWJlbHMgPSAiQVVUTyIpCgpmaWd1cmU0LnhfY2FwIDwtIGFkZF9zdWIoZmlndXJlNC54X3Bsb3RzLCBzdHJfd3JhcCgiRmlndXJlIDQueDogRGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBVUyBhZHVsdHMnIGFuZCBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBjb25jZXB0dWFsIHVuaXRzIGluIFN0dWR5IDIuIHRoaXMgaW5jbHVkZXMgZGlmZmVyZW5jZSBzY29yZXMgdXNpbmcgYWR1bHRzJyBCT0RZLCBIRUFSVCwgYW5kIE1JTkQgc2NhbGVzIChwYW5lbCBCKSBhbmQgZGlmZmVyZW5jZSBzY29yZXMgdXNpbmcgY2hpbGRyZW4ncyBvd24gc2NhbGVzIChwYW5lbCBDOyBzZWUgVGFibGUgNC54KS4gRm9yIGVhY2ggY29uY2VwdHVhbCB1bml0LCBzY29yZXMgY291bGQgcmFuZ2UgZnJvbSAwLTEsIHN1Y2ggdGhhdCBkaWZmZXJlbmNlIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIC0xIHRvICsxLiBJbmRpdmlkdWFsIHBhcnRpY2lwYW50cyBhcmUgcGxvdHRlZCBhcyBzbWFsbCwgdHJhbnNsdWNlbnQgY2lyY2xlcywgYW5kIG1lYW4gZGlmZmVyZW5jZSBzY29yZXMgYnkgY2hhcmFjdGVyIGFyZSBwbG90dGVkIGFzIGxhcmdlciwgc29saWQgZGlhbW9uZHMuIEVycm9yIGJhcnMgYXJlIDk1JSBib290c3RyYXBwZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMuIFRoZSBkb3R0ZWQgbGluZSBjb3JyZXNwb25kcyB0byBlcXVhbCBlbmRvcnNlbWVudHMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIHBsb3R0ZWQgKGkuZS4sIGEgZGlmZmVyZW5jZSBzY29yZSBvZiAwKS4iLCAxODApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gOCwgZmlnLmFzcCA9IDAuMzh9CmdnZHJhdyhmaWd1cmU0LnhfY2FwKQpgYGAKCiMjIERpc2N1c3Npb24KClhYIF9fSU5TRVJUIFNUVURZIDIgRElTQ1VTU0lPTl9fCgpgYGB7cn0KcmVndGFiX3N0dWR5MiA8LSByZWd0YWJfZDJfYWRfc2NvcmVkX2FkX2RpZmYgJT4lCiAgZnVsbF9qb2luKHJlZ3RhYl9kMl83OV9zY29yZWRfYWRfZGlmZikgJT4lCiAgZnVsbF9qb2luKHJlZ3RhYl9kMl83OV9zY29yZWRfNzlfZGlmZikgJT4lCiAgbXV0YXRlX2F0KHZhcnMoYiwgcy5lLiksCiAgICAgICAgICAgIGZ1bnMoZm9ybWF0KHJvdW5kKC4sIGRpZ2l0cyA9IDIpLCBuc21hbGwgPSAyKSkpICU+JQogIHVuaXRlKHJlc3VsdCwgYiwgcy5lLiwgQ0k5NSwgbm9uemVybykgJT4lCiAgc3ByZWFkKHN0dWR5LCByZXN1bHQpICU+JQogIHNlcGFyYXRlKGBBZHVsdHNgLCBjKCJzMmFfYiIsICJzMmFfcy5lLiIsICJzMmFfOTUlIENJIiwgInMyYV9ueiIpLCBzZXAgPSAiXyIpICU+JQogIHNlcGFyYXRlKGBDaGlsZHJlbiwgNy05eSAodXNpbmcgYWR1bHRzJyBzY2FsZXMpYCwgYygiczJiX2IiLCAiczJiX3MuZS4iLCAiczJiXzk1JSBDSSIsICJzMmJfbnoiKSwgc2VwID0gIl8iKSAlPiUKICBzZXBhcmF0ZShgQ2hpbGRyZW4sIDctOXkgKHVzaW5nIHRoZWlyIG93biBzY2FsZXMpYCwgYygiczJjX2IiLCAiczJjX3MuZS4iLCAiczJjXzk1JSBDSSIsICJzMmNfbnoiKSwgc2VwID0gIl8iKQpgYGAKCmBgYHtyfQp0YWJsZTQueCA8LSByZWd0YWJfc3R1ZHkyICU+JQogIHNlbGVjdCgtcGFpciwgLWNvbnRhaW5zKCJzLmUuIikpICU+JQogIHJlbmFtZShQYXJhbWV0ZXIgPSBwYXJhbSkgJT4lCiAgcmVuYW1lX2FsbChmdW5zKGdzdWIoIm56IiwgIiAiLCAuKSkpICU+JQogIHJlbmFtZV9hbGwoZnVucyhnc3ViKCJzMi5fIiwgIiIsIC4pKSkgJT4lCiAga2FibGUoZm9ybWF0ID0gImh0bWwiLCBhbGlnbiA9IGMoImwiLCByZXAoYyhyZXAoInIiLCAyKSwgImwiKSwgMykpLCAKICAgICAgICBjYXB0aW9uID0gIlRhYmxlIDQueDogUmVncmVzc2lvbiBhbmFseXNlcyBvZiBkaWZmZXJlbmNlIHNjb3JlcyBhbW9uZyBVUyBhZHVsdHMgYW5kIGNoaWxkcmVuICg3LTl5IG9mIGFnZSkgaW4gU3R1ZHkgMi4gWFggQUREIElORk8gUkUgQ0hJTERSRU4uIFRoZSB0YWJsZSBwcmVzZW50cyByZXN1bHRzIGZyb20gc2VwYXJhdGUgQmF5ZXNpYW4gcmVncmVzc2lvbnMgb2YgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKEJPRFkgdnMuIEhFQVJULCBCT0RZIHZzLiBNSU5ELCBhbmQgSEVBUlQgdnMuIE1JTkQpLiBFYWNoIHJlZ3Jlc3Npb24gaW5jbHVkZWQgdHdvIGZpeGVkIGVmZmVjdCBwYXJhbWV0ZXJzOiAoMSkgdGhlIGludGVyY2VwdCwgd2hpY2ggSSB0cmVhdCBhcyBhbiBpbmRleCBvZiB0aGUgYXN5bW1ldHJ5IGluIGF0dHJpYnV0aW9ucyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgaW4gcXVlc3Rpb247IGFuZCAoMikgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMsIHJlcG9ydGVkIGhlcmUgYXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJvYm90IGFuZCB0aGUgZ3JhbmQgbWVhbiAoR00pLiBUaGUgaW50ZXJjZXB0cyBhcmUgaGlnaGxpZ2h0ZWQgaW4gYm9sZCwgYmVjYXVzZSB0aGVzZSBhcmUgdGhlIHByaW1hcnkgcGFyYW1ldGVycyBvZiBpbnRlcmVzdCBmb3IgdGhlc2UgYW5hbHlzZXMuIEZvciBlYWNoIHBhcmFtZXRlciwgdGhlIHRhYmxlIGluY2x1ZGVzIHRoZSBlc3RpbWF0ZSAoYikgYW5kIGEgOTUlIGNyZWRpYmxlIGludGVydmFsIGZvciB0aGF0IGVzdGltYXRlLiBBc3Rlcmlza3MgaW5kaWNhdGUgOTUlIGNyZWRpYmxlIGludGVydmFscyB0aGF0IGRvIG5vdCBpbmNsdWRlIDAuIikgJT4lICAKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgcm93X3NwZWMoYygxLCAzLCA1KSwgYm9sZCA9IFQpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBIRUFSVCIsIDEsIDIpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBNSU5EIiwgMywgNCkgJT4lCiAgZ3JvdXBfcm93cygiSEVBUlQgLSBNSU5EIiwgNSwgNikgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICJBZHVsdHMiID0gMywKICAgICAgICAgICAgICAgICAgICAgIkNoaWxkcmVuLCA3LTl5ICh1c2luZyBhZHVsdHMnIHNjYWxlcykiID0gMywKICAgICAgICAgICAgICAgICAgICAgIkNoaWxkcmVuLCA3LTl5ICh1c2luZyB0aGVpciBvd24gc2NhbGVzKSIgPSAzKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CnRhYmxlNC54CmBgYAoKYGBge3J9CnRhYmxlNC54IDwtIHJlZ3RhYl9kMl9hZDc5X3Njb3JlZF9hZF9kaWZmICU+JQogIHNlbGVjdCgtcGFpciwgLXN0dWR5LCAtY29udGFpbnMoInMuZS4iKSkgJT4lCiAgbXV0YXRlKGIgPSBmb3JtYXQocm91bmQoYiwgMiksIG5zbWFsbCA9IDIpKSAlPiUKICByZW5hbWUoUGFyYW1ldGVyID0gcGFyYW0sCiAgICAgICAgIGA5NSUgQ0lgID0gQ0k5NSkgJT4lCiAgcmVuYW1lX2FsbChmdW5zKGdzdWIoIm5vbnplcm8iLCAiICIsIC4pKSkgJT4lCiAga2FibGUoZm9ybWF0ID0gImh0bWwiLCBhbGlnbiA9IGMoImwiLCByZXAoYyhyZXAoInIiLCAyKSwgImwiKSwgMykpLCAKICAgICAgICBjYXB0aW9uID0gIlRhYmxlIDQueDogUmVncmVzc2lvbiBhbmFseXNlcyBvZiBkaWZmZXJlbmNlcyBpbiBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIFVTIGFkdWx0cyBhbmQgY2hpbGRyZW4gKDctOXkgb2YgYWdlKSBkaWZmZXJlbmNlIHNjb3JlcyBpbiBTdHVkeSAyLiBUaGUgdGFibGUgcHJlc2VudHMgcmVzdWx0cyBmcm9tIHNlcGFyYXRlIEJheWVzaWFuIHJlZ3Jlc3Npb25zIG9mIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChCT0RZIHZzLiBIRUFSVCwgQk9EWSB2cy4gTUlORCwgYW5kIEhFQVJUIHZzLiBNSU5EKS4gRWFjaCByZWdyZXNzaW9uIGluY2x1ZGVkIGZvdXIgZml4ZWQgZWZmZWN0IHBhcmFtZXRlcnM6ICgxKSB0aGUgaW50ZXJjZXB0IChmb3IgYWR1bHRzKSwgd2hpY2ggSSB0cmVhdCBhcyBhbiBpbmRleCBvZiB0aGUgYXN5bW1ldHJ5IGluIGF0dHJpYnV0aW9ucyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgaW4gcXVlc3Rpb24gYW1vbmcgYWR1bHRzOyAoMikgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMgKGFtb25nIGFkdWx0cyksIHJlcG9ydGVkIGhlcmUgYXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJvYm90IGFuZCB0aGUgZ3JhbmQgbWVhbiAoR00pOyAoMykgdGhlIG92ZXJhbGwgZGlmZmVyZW5jZSBiZXR3ZWVuIGNoaWxkcmVuIGFuZCBhZHVsdHMgKGNvbGxhcHNpbmcgYWNyb3NzIHRhcmdldCBjaGFyYWN0ZXJzKTsgYW5kICg0KSB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGlzIGFnZSBkaWZmZXJlbmNlIGFuZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzLiBUaGUgZGV2ZWxvcG1lbnRhbCBjb21wYXJpc29ucyBhcmUgaGlnaGxpZ2h0ZWQgaW4gYm9sZCwgYmVjYXVzZSB0aGVzZSBhcmUgdGhlIHByaW1hcnkgcGFyYW1ldGVycyBvZiBpbnRlcmVzdCBmb3IgdGhlc2UgYW5hbHlzZXMuIEZvciBlYWNoIHBhcmFtZXRlciwgdGhlIHRhYmxlIGluY2x1ZGVzIHRoZSBlc3RpbWF0ZSAoYikgYW5kIGEgOTUlIGNyZWRpYmxlIGludGVydmFsIGZvciB0aGF0IGVzdGltYXRlLiBBc3Rlcmlza3MgaW5kaWNhdGUgOTUlIGNyZWRpYmxlIGludGVydmFscyB0aGF0IGRvIG5vdCBpbmNsdWRlIDAuIikgJT4lICAKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgcm93X3NwZWMoc2VxKDIsIDEyLCAyKSwgYm9sZCA9IFQpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBIRUFSVCIsIDEsIDQpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBNSU5EIiwgNSwgOCkgJT4lCiAgZ3JvdXBfcm93cygiSEVBUlQgLSBNSU5EIiwgOSwgMTIpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLAogICAgICAgICAgICAgICAgICAgICAiRGV2ZWxvcG1lbnRhbCBjb21wYXJpc29uIiA9IDMpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0KdGFibGU0LngKYGBgCgoKIyBTdHVkeSAzOiBDb25jZXB0dWFsIGNoYW5nZSBvdmVyIGVhcmx5IGFuZCBtaWRkbGUgY2hpbGRob29kICg0LTl5KQoKWFggX19JTlNFUlQgU1RVRFkgMyBJTlRST0RVQ1RJT05fXwoKSW4gU3R1ZHkgMywgYHIgbnJvdyhkM19hZF93aWRlKWAgVVMgYWR1bHRzLCBgciBucm93KGQzXzc5X3dpZGUpYCAib2xkZXIiIGNoaWxkcmVuIChgciBzdW1tYXJ5KGQzXzc5JGFnZSlbIk1pbi4iXSAlPiUgcm91bmQoMilgLWByIHN1bW1hcnkoZDNfNzkkYWdlKVsiTWF4LiJdICU+JSByb3VuZCgyKWAgeWVhcnM7IG1lZGlhbjogYHIgc3VtbWFyeShkM183OSRhZ2UpWyJNZWRpYW4iXSAlPiUgcm91bmQoMilgeSksIGFuZCBgciBucm93KGQzXzQ2X3dpZGUpYCAieW91bmdlciIgY2hpbGRyZW4gKGByIHN1bW1hcnkoZDNfNDYkYWdlKVsiTWluLiJdICU+JSByb3VuZCgyKWAtYHIgc3VtbWFyeShkM180NiRhZ2UpWyJNYXguIl0gJT4lIHJvdW5kKDIpYCB5ZWFyczsgbWVkaWFuOiBgciBzdW1tYXJ5KGQzXzQ2JGFnZSlbIk1lZGlhbiJdICU+JSByb3VuZCgyKWB5KSBlYWNoIGFzc2Vzc2VkIGEgc2luZ2xlIHRhcmdldCBjaGFyYWN0ZXIgb24gMjAgbWVudGFsIGNhcGFjaXRpZXMuIFRvIG1ha2UgdGhlIHN0dWR5IGFwcHJvcHJpYXRlIGZvciBjaGlsZHJlbiBpbiB0aGlzIGFnZSByYW5nZSwgcGFydGljaXBhbnRzIGFzc2Vzc2VkIGEgc3Vic2V0IG9mIHRoZSA0MCBtZW50YWwgY2FwYWNpdGllcyBlbXBsb3llZCBpbiBTdHVkeSAyLCBjaG9zZW4gdG8gcmVwcmVzZW50IHRoZSB0aHJlZSAiY29uY2VwdHVhbCB1bml0cyIgcmV2ZWFsZWQgYnkgU3R1ZGllcyAxLTIgKEJPRFksIEhFQVJULCBhbmQgTUlORCkgYW5kIHRvIGNvdmVyIGEgc2ltaWxhciByYW5nZSBvZiBtZW50YWwgY2FwYWNpdGllcyBhcyBTdHVkaWVzIDEtMi4gQXMgaW4gU3R1ZHkgMiwgcGFydGljaXBhbnRzIHJlc3BvbmRlZCBvbiBhIDMtcG9pbnQgc2NhbGUgKCJubywiIGNvZGVkIGFzIDA7ICJraW5kYSwiIGNvZGVkIGFzIDAuNSwgInllcywiIGNvZGVkIGFzIDEpLiBUaGlzIHN0dWR5IGVtcGxveWVkIHRoZSAiZGl2ZXJzZSBjaGFyYWN0ZXJzIiB2YXJpYW50IG9mIHRoZSBnZW5lcmFsIGFwcHJvYWNoLCB3aXRoIHBhcnRpY2lwYW50cyByYW5kb21seSBvciBwc2V1ZG8tcmFuZG9tbHkgYXNzaWduZWQgdG8gYXNzZXNzIGVpdGhlciBvbmUgb2YgdGhlIGZvbGxvd2luZyA5IGNoYXJhY3RlcnM6IGFuIGVsZXBoYW50LCBhIGdvYXQsIGEgbW91c2UsIGEgYmlyZCwgYSBiZWV0bGUsIGEgdGVkZHkgYmVhciwgYSBkb2xsLCBhIHJvYm90LCBvciBhIGNvbXB1dGVyLiAoU2VlIENoYXB0ZXIgSUkgZm9yIGRldGFpbGVkIG1ldGhvZHMuKQoKIyMgU3BlY2lhbCBub3RlcyBvbiBkYXRhIHByb2Nlc3NpbmcgYW5kIGFuYWx5c2lzCgojIyBSZXN1bHRzCgojIyMgQWR1bHRzCgojIyMjIFNjYWxlIGNvbnN0cnVjdGlvbgoKYGBge3J9CnNjYWxlc19lZmFfd2RtX2QzX2FkIDwtIHNjYWxlX2Z1bihlZmFfd2RtX2QzX2FkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9uYW1lcyA9IGZhY3Rvcl9uYW1lc19lZmFfd2RtX2QzX2FkKQpkM19hZF9zY29yZWRfYWQgPC0gc2NvcmVfZnVuKGQzX2FkLCBzY2FsZXNfZWZhX3dkbV9kM19hZCkKCnNhdmVSRFMoc2NhbGVzX2VmYV93ZG1fZDNfYWQsIGZpbGUgPSAiLi9zdG9yZWQvc2NhbGVzL3NjYWxlc19lZmFfd2RtX2QzX2FkIikKc2F2ZVJEUyhkM19hZF9zY29yZWRfYWQsIGZpbGUgPSAiLi9zdG9yZWQvc2NvcmVkX2RhdGEvZDNfYWRfc2NvcmVkX2FkIikKYGBgCgpGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiAiR2VuZXJhbCBhbmFseXNpcyBwbGFuLCIgYWJvdmUsIHlpZWxkZWQgYHIgZmFjdF9uYW1lX2Z1bihmYWN0b3JfbmFtZXNfZWZhX3dkbV9kM19hZClgIHNjYWxlcyBvZiBgciBzY2FsZXNfZWZhX3dkbV9kM19hZCAlPiUgY291bnQoZmFjdG9yKSAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKG4pKSAlPiUgc2VsZWN0KG1lYW4pICU+JSBhcy5udW1lcmljKClgIGl0ZW1zIGVhY2g7IHNlZSBUYWJsZSA0LnguCgojIyMjIFZpc3VhbGl6YXRpb24KCmBgYHtyfQpwbG90c19kM19hZF9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkM19hZF9zY29yZWRfYWQsIGNvbG9ycyA9IGNvbG9yczA5KQpgYGAKCmBgYHtyfQpmaWdfZDNfYWRfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2QzX2FkX3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QzX2FkX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2QzX2FkX3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkExIiwgIkEyIiwgIkEzIiksIG5jb2wgPSAzKQoKZmlnX2QzX2FkX2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2QzX2FkX3Njb3JlZF9hZFtbMV1dICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIAogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDksCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gY29sb3JzMDksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSA5KSkpCgpmaWdfZDNfYWRfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWdfZDNfYWRfcGxvdHMsIGZpZ19kM19hZF9sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWdfZDNfYWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSAzOiBBZHVsdHMiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlnX2QzX2FkX3Bsb3RzX2xlZ190aXRsZSA8LSBwbG90X2dyaWQoZmlnX2QzX2FkX3RpdGxlLCBmaWdfZDNfYWRfcGxvdHNfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDAuMTIsIDEpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCmZpZ19kM19hZF9wbG90c19sZWdfdGl0bGUKYGBgCgpWaXN1YWxpemF0aW9ucyBvZiByZWxhdGlvbnNoaXBzIGFtb25nIHNjb3JlcyBvbiB0aGVzZSBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NhbGVzIGFyZSBwcm92aWRlZCBpbiBGaWd1cmUgNC54LCByb3cgQS4KCiMjIyMjIEJPRFkgdnMuIEhFQVJUCgpGaXJzdCBJIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEJPRFkgYW5kIEhFQVJUIChGaWd1cmUgNC54LCBwYW5lbCBBMSkuIEVjaG9pbmcgdGhlIHZpc3VhbGl6YXRpb25zIG9mIGFkdWx0cycgcmVzcG9uc2VzIGluIFN0dWRpZXMgMSBhbmQgMiwgdHdvIHN0cmlraW5nIGZlYXR1cmVzIG9mIHRoaXMgdmlzdWFsaXphdGlvbiBhcmUgdGhhdCAoMSkgdGhlcmUgaXMgYSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzY29yZXMgb24gdGhlIF9CT0RZXyBhbmQgX0hFQVJUXyBzY2FsZXM7IGFuZCAoMikgdGhlcmUgYXJlIHZpcnR1YWxseSBubyBkYXRhcG9pbnRzIGFib3ZlIHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkLCBkb3R0ZWQgZGlhZ29uYWwgbGluZSksIGFuZCBjZXJ0YWlubHkgbm8gZGF0YXBvaW50cyBpbiB1cHBlciBsZWZ0IHF1YWRyYW50LiBJbmRpdmlkdWFsIHBhcnRpY2lwYW50cyB0ZW5kZWQgdG8gZW5kb3JzZSB0aGUgbWVudGFsIGNhcGFjaXR5IGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBfQk9EWV8gc2NhbGUgYXQgbGVhc3QgYXMgc3Ryb25nbHksIGFuZCBvZnRlbiBtb3JlIHN0cm9uZ2x5LCB0aGFuIHRoZXkgZW5kb3JzZWQgaXRlbXMgaW5jbHVkZWQgaW4gdGhlIF9IRUFSVF8gc2NhbGXigJRpbiBvdGhlciB3b3JkcywgbWFueSBwYXJ0aWNpcGFudHMgYXR0cmlidXRlZCBtb3JlIEJPRFkgdGhhbiBIRUFSVCB0byB0aGUgdGFyZ2V0IGNoYXJhY3RlciBpbiBxdWVzdGlvbiwgYnV0IHZpcnR1YWxseSBubyBwYXJ0aWNpcGFudHMgYXR0cmlidXRlZCBtb3JlIEhFQVJUIHRoYW4gQk9EWS4gCgpBbiBhbmFseXNpcyBvZiBtZWFuIHNjb3JlcyBieSB0YXJnZXQgY2hhcmFjdGVyIGZ1cnRoZXIgcmV2ZWFscyBhIHN1aXRlIG9mIGNoYXJhY3RlcnPigJRuYW1lbHksIGluYW5pbWF0ZSBvYmplY3Rz4oCUdGhhdCwgaW4gdGhlIGFnZ3JlZ2F0ZSwgcmVjZWl2ZWQgdmVyeSBsb3cgX0JPRFlfIHNjb3JlcyBhbmQgdmVyeSBsb3cgX0hFQVJUXyBzY29yZXMuIFRoaXMgc3VpdGUgb2YgY2hhcmFjdGVycyBhcHBlYXJzIHRvIGJlIGRpc3RpbmN0IGZyb20gdGhlIG90aGVyIGNoYXJhY3RlcnPigJRhbGwgYW5pbWF0ZSBiZWluZ3PigJRhbGwgb2Ygd2hpY2gsIGluIHRoZSBhZ2dyZWdhdGUsIHJlY2VpdmVkIHJlbGF0aXZlbHkgaGlnaCBfQk9EWV8gc2NvcmVzLCBidXQgdmFyaWVkIGluIHRoZWlyIG1lYW4gX0hFQVJUXyBzY29yZXMuIEVjaG9pbmcgU3R1ZHkgMWQsIHRoaXMgcmFpc2VzIHRoZSBpbnRyaWd1aW5nIHBvc3NpYmlsaXR5IHRoYXQgYWR1bHRzJyBhdHRyaWJ1dGlvbnMgb2YgQk9EWSBhbmQgSEVBUlQgbWF5IGhhdmUgYmVlbiBnb3ZlcmVkIGJ5IHNvbWUgc29ydCBvZiAidGhyZXNob2xkIiBtb2RlbCwgaW4gd2hpY2ggYXR0cmlidXRpb25zIG9mIGFueSBzdWJzdGFudGlhbCBhbW91bnQgb2YgSEVBUlQgZGVwZW5kIG9uIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGhhdmluZyBhIGNlcnRhaW4gZGVncmVlIG9mIEJPRFkuIChUaGlzIHdpbGwgbm90IGJlIGV4cGxvcmVkIGZ1cnRoZXIgaW4gdGhlIGN1cnJlbnQgZGlzc2VydGF0aW9uLikKCiMjIyMjIEJPRFkgdnMuIE1JTkQKCk5leHQgSSB3aWxsIGNvbnNpZGVyIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBCT0RZIGFuZCBNSU5EIChGaWd1cmUgNC54LCBwYW5lbCBBMikuIEFzIGluIHZpc3VhbGlhdGlvbnMgb2YgYWR1bHRzJyByZXNwb25zZXMgaW4gU3R1ZGllcyAxIGFuZCAyLCB0d28gbm90YWJsZSBmZWF0dXJlcyBvZiB0aGlzIHZpc3VhbGl6YXRpb24gYXJlIHRoYXQgKDEpIHRoZXJlIGlzIGEgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9NSU5EXyBzY2FsZXM7IGFuZCAoMikgdGhlcmUgYXJlIGZld2VyIGRhdGFwb2ludHMgYmVsb3cgdGhlIGxpbmUgb2YgZXF1aXZhbGVuY2UgKCR5ID0geCQsIGRvdHRlZCBkaWFnb25hbCBsaW5lKSB0aGFuIGFib3ZlIGl0LCBhbmQgbm8gZGF0YXBvaW50cyBpbiBsb3dlciByaWdodCBxdWFkcmFudC4gRWNob2luZyBTdHVkeSAxZCwgaG93ZXZlciwgd2hpbGUgcGFydGljaXBhbnRzIHdobyBhc3Nlc3NlZCBjZXJ0YWluIHRhcmdldCBjaGFyYWN0ZXJzIChuYW1lbHksIHRoZSB0d28gdGVjaG5vbG9naWVzOiBhIHJvYm90IGFuZCBhIGNvbXB1dGVyKSB0ZW5kZWQgdG8gZW5kb3JzZSB0aGUgbWVudGFsIGNhcGFjaXR5IGl0ZW1zIGluY2x1ZGVkIGluIHRoZSBfTUlORF8gc2NhbGUgcm91Z2hseSBhcyBzdHJvbmdseSwgYW5kIG9mdGVuIG1vcmUgc3Ryb25nbHksIHRoYW4gdGhleSBlbmRvcnNlZCBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX0JPRFlfIHNjYWxlLCBwYXJ0aWNpcGFudHMgd2hvIGFzc3Nlc3NlZCBvdGhlciB0YXJnZXQgY2hhcmFjdGVycywgaWYgYW55dGhpbmcsIGFwcGVhciB0byBoYXZlIHNob3duIHRoZSByZXZlcnNlIHBhdHRlcm4sIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgc2xpZ2h0bHkgbGVzcyBzdHJvbmdseSB0aGFuIF9CT0RZXyBpdGVtcy4gSW4gb3RoZXIgd29yZHMsIGluIHRoaXMgImRpdmVyc2UgY2hhcmFjdGVycyIgYXBwcm9hY2ggc2hhcmVkIGJ5IFN0dWRpZXMgMWQgYW5kIHRoZSBjdXJyZW50IHN0dWR5LCB0aGVyZSBhcHBlYXJzIHRvIGJlIGEgbGVzcyBjb25zaXN0ZW5jeSBpbiB0aGUgImFzeW1tZXRyeSIgYmV0d2VuIEJPRFkgYW5kIE1JTkQgaW4gdGhhbiB0aGVyZSB3YXMgdXNpbmcgdGhlICJlZGdlIGNhc2VzIiBhcHByb2FjaCBvZiBTdHVkaWVzIDFhLTFjIGFuZCBTdHVkeSAyLgoKIyMjIyMgSEVBUlQgdnMuIE1JTkQKCkZpbmFsbHkgSSB3aWxsIGNvbnNpZGVyIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBIRUFSVCBhbmQgTUlORCAoRmlndXJlIDQueCwgcGFuZWwgQTEpLiBBcyBpbiBTdHVkeSAxLCB0aGUgbW9zdCBzdHJpa2luZyBmZWF0dXJlcyBvZiB0aGlzIHZpc3VhbGl6YXRpb24gYXJlIHRoYXQgKDEpIHRoZXJlIGlzIGEgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfSEVBUlRfIGFuZCBfTUlORF8gc2NhbGVzOyBhbmQgKDIpIHRoZXJlIGFyZSB2aXJ0dWFsbHkgbm8gZGF0YXBvaW50cyBiZWxvdyB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpLCBhbmQgY2VydGFpbmx5IG5vIGRhdGFwb2ludHMgaW4gbG93ZXIgcmlnaHQgcXVhZHJhbnQuIEluZGl2aWR1YWwgcGFydGljaXBhbnRzIHRlbmRlZCB0byBlbmRvcnNlIHRoZSBtZW50YWwgY2FwYWNpdHkgaXRlbXMgaW5jbHVkZWQgaW4gdGhlIF9NSU5EXyBzY2FsZSBhdCBsZWFzdCBhcyBzdHJvbmdseSwgYW5kIG9mdGVuIG1vcmUgc3Ryb25nbHksIHRoYW4gdGhleSBlbmRvcnNlZCBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgX0hFQVJUXyBzY2FsZeKAlGluIG90aGVyIHdvcmRzLCBtYW55IHBhcnRpY2lwYW50cyBhdHRyaWJ1dGVkIG1vcmUgTUlORCB0aGFuIEhFQVJUIHRvIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGluIHF1ZXN0aW9uLCBidXQgdmlydHVhbGx5IG5vIHBhcnRpY2lwYW50cyBhdHRyaWJ1dGVkIG1vcmUgSEVBUlQgdGhhbiBNSU5ELgoKQW4gYW5hbHlzaXMgb2YgbWVhbiBzY29yZXMgYnkgdGFyZ2V0IGNoYXJhY3RlciBmdXJ0aGVyIHJldmVhbHMgdGhhdCwgaW4gdGhlIGFnZ3JlZ2F0ZSwgY2hhcmFjdGVycyB0aGF0IHJlY2VpdmVkIGxvdyBfTUlORF8gc2NvcmVzICh0aGUgdHdvIGluZXJ0IHRveXM6IGEgdGVkZHkgYmVhciBhbmQgYSBkb2xsKSBhbHNvIHJlY2VpdmVkIGxvdyBtZWFuIF9IRUFSVF8gc2NvcmVzLCB3aGlsZSBjaGFyYWN0ZXJzIHRoYXQgcmVjZWl2ZWQgcmVsYXRpdmVseSBoaWdoIF9NSU5EXyBzY29yZXMgKGUuZy4sIHRoZSByb2JvdCBhbmQgYWxsIG9mIHRoZSBhaW1hdGUgYmVpbmdzKSB2YXJpZWQgaW4gdGhlaXIgbWVhbiBfSEVBUlRfIHNjb3Jlcy4gQWdhaW4sIHRoaXMgZWNob2VzIHRoZSBpbnRyaWd1aW5nIHBvc3NpYmlsaXR5LCByYWlzZWQgYnkgU3R1ZHkgMWQsIHRoYXQgYXR0cmlidXRpb25zIG9mIEhFQVJUIGFuZCBNSU5EIG1heSBoYXZlIGJlZW4gZ292ZXJlZCBieSBzb21lIHNvcnQgb2YgInRocmVzaG9sZCIgbW9kZWwsIGluIHdoaWNoIGF0dHJpYnV0aW9ucyBvZiBhbnkgc3Vic3RhbnRpYWwgYW1vdW50IG9mIEhFQVJUIGRlcGVuZCBvbiB0aGUgdGFyZ2V0IGNoYXJhY3RlciBoYXZpbmcgYSBjZXJ0YWluIGRlZ3JlZSBvZiBNSU5ELiAoQWdhaW4sIHRoaXMgd2lsbCBub3QgYmUgZXhwbG9yZWQgZnVydGhlciBpbiB0aGUgY3VycmVudCBkaXNzZXJ0YXRpb24uKQoKIyMjIyMgSW50ZXJpbSBkaXNjdXNzaW9uCgpNeSBpbmZvcm1hbCBvYnNlcnZhdGlvbnMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgYWR1bHRzJyBlbmRvcnNlbWVudHMgb2YgdGhlIHRoZSBjb25jZXB0dWFsIHVuaXRzIGluIFN0dWR5IDMgYXJlIHZlcnkgc2ltaWxhciB0byB0aG9zZSBmb3IgYWR1bHRzIGluIFN0dWRpZXMgMSBhbmQgMiAocGFydGljdWxhcmx5IFN0dWR5IDFkLCB3aGljaCBhbHNvIGVtcGxveWVkIHRoZSAiZGl2ZXJzZSBjaGFyYWN0ZXJzIiBhcHByb2FjaCB0YWtlbiBoZXJlKTogKDEpIEFsbCBvZiB0aGVzZSBpbnRlci11bml0IHJlbGF0aW9uc2hpcHMgd2VyZSBwb3NpdGl2ZSwgc3VjaCB0aGF0IHRoZSBtb3JlIHN0cm9uZ2x5IGEgcGFydGljaXBhbnQgZW5kb3JzZWQgb25lIGNvbmNlcHR1YWwgdW5pdCwgdGhlIG1vcmUgc3Ryb25nbHkgdGhleSB0ZW5kZWQgdG8gZW5kb3JzZSB0aGUgb3RoZXJzOyBhbmQgKDIpIFRoZXJlIHdlcmUgcm9idXN0IGFzeW1tZXRyaWVzIGluIHRoZXNlIHBvc2l0aXZlIHJlbGF0aW9uc2hpcHMsIHN1Y2ggdGhhdCBwYXJ0aWNpcGFudHMgdGVuZGVkIHRvIGVuZG9yc2UgZWl0aGVyIEJPRFkgb3IgTUlORCBtb3JlIHN0cm9uZ2x5IHRoYW4gSEVBUlQuIEFzIGluIFN0dWR5IDFkLCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQk9EWSB2cy4gTUlORCBhcHBlYXJzIHRvIGJlIG1vcmUgdmFyaWFibGUgYWNyb3NzIHBhcnRpY2lwYW50cyBhbmQgYWNyb3NzIHRhcmdldCBjaGFyYWN0ZXJzIHRoYW4gdGhlIGdlbmVyYWxseSBhc3ltbWV0cmljYWwgcmVsYXRpb25zaGlwICh3aXRoIHBhcnRpY2lwYW50cyB0ZW5kaW5nIHRvIGF0dHJpYnV0ZSBtb3JlIE1JTkQgdGhhbiBCT0RZKSB0aGF0IGVtZXJnZWQgaW4gc3R1ZGllcyB0aGF0IHVzZWQgdGhlICJlZGdlIGNhc2UiIGFwcHJvYWNoIChTdHVkaWVzIDFhLTFjIGFuZCBTdHVkeSAyKS4KCiMjIyMgQW5hbHlzaXMgb2YgYXN5bW1ldHJpZXMKCkhlcmUgSSBwcm92aWRlIGEgZm9ybWFsIGFuYWx5c2lzIG9mIHRoZSBhc3ltbWV0cmllcyByZXZlYWxlZCBieSB0aGUgdmlzdWFsaXphdGlvbnMgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24uIEZvciBlYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cyAoQk9EWSB2cy4gSEVBUlQsIEJPRFkgdnMuIE1JTkQsIGFuZCBIRUFSVCB2cy4gTUlORCksIEkgdXNlZCBCYXllc2lhbiByZWdyZXNzaW9uIHRvIGNvbXBhcmUgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiB0aGVzZSB0d28gY29uY2VwdHVhbCB1bml0cyB0byB6ZXJvLCBjb250cm9sbGluZyBmb3IgZGlmZmVyZW5jZXMgaW4gYXNzZXNzbWVudHMgb2YgdGhlIG5pbmUgImRpdmVyc2UgY2hhcmFjdGVycyIgdGhhdCB3ZXJlIGZlYXR1cmVkIGFzIHRhcmdldCBjaGFyYWN0ZXJzIGluIHRoZXNlIHN0dWRpZXMuIFNlZSBGaWd1cmUgNC54LCBwYW5lbCBBLCBmb3IgdmlzdWFsIGRlcGljdGlvbnMgb2YgdGhlc2UgZGlmZmVyZW5jZSBzY29yZXMuCgpgYGB7cn0KZDNfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9mdW4oZDNfYWRfc2NvcmVkX2FkKQpjb250cmFzdHMoZDNfYWRfc2NvcmVkX2FkX2RpZmYkY2hhcmFjdGVyKSA8LSBjb250cmFzdHNfc3VtX2R2MDkKCnNhdmVSRFMoZDNfYWRfc2NvcmVkX2FkX2RpZmYsICIuL3N0b3JlZC9kaWZmc2NvcmVfZGF0YS9kM19hZF9zY29yZWRfYWRfZGlmZiIpCmBgYAoKYGBge3J9CnBsb3RfZDNfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZnBsb3RfZnVuKGQzX2FkX3Njb3JlZF9hZF9kaWZmLCBjb2xvcnMgPSBjb2xvcnMwOSkKYGBgCgpgYGB7cn0KIyByX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDNfYWRfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKcl9kM19hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpzdW1tYXJ5KHJfZDNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkM19hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpyX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpzdW1tYXJ5KHJfZDNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDNfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciwKIyAgIGRhdGEgPSBkM19hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kM19hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpyX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM19hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnN1bW1hcnkocl9kM19hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKQpgYGAKCmBgYHtyfQpyZWd0YWJfZDNfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9yZWdfdGFibGVfZnVuKAogIHJlZ19saXN0ID0gbGlzdChyX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiAgICAgICAgICAgICAgICAgIHJfZDNfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAogICAgICAgICAgICAgICAgICByX2QzX2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpLAogIHBhaXJfbGlzdCA9IGMoIkJPRFkgLSBIRUFSVCIsICJCT0RZIC0gTUlORCIsICJIRUFSVCAtIE1JTkQiKSwKICBzdHVkeV9uYW1lID0gIkFkdWx0cyIsCiAgY2hhcl9sYWJlbCA9IGMoIkVsZXBoYW50IHZzLiBHTSIsICJHb2F0IHZzLiBHTSIsICJNb3VzZSB2cy4gR00iLAogICAgICAgICAgICAgICAgICJCaXJkIHZzLiBHTSIsICJCZWV0bGUgdnMuIEdNIiwgIlRlZGR5IGJlYXIgdnMuIEdNIiwKICAgICAgICAgICAgICAgICAiRG9sbCB2cy4gR00iLCAiUm9ib3QgdnMuIEdNIikpCmBgYAoKYGBge3J9CiMgaW50ZXJpbSB0YWJsZSBmb3IgZWFzZSBvZiB3cml0aW5nCnJlZ3RhYl9kM19hZF9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXN0dWR5LCAtcy5lLikgJT4lCiAgZmlsdGVyKHBhcmFtID09ICJJbnRlcmNlcHQiKSAlPiUKICBrYWJsZShkaWdpdHMgPSAyKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuNH0KIyBpbnRlcmltIHBsb3QgZm9yIGVhc2Ugb2Ygd3JpdGluZwpwbG90X2QzX2FkX3Njb3JlZF9hZF9kaWZmCmBgYAoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkFzIGluIFN0dWRpZXMgMSBhbmQgMiwgZGlmZmVyZW5jZSBzY29yZXMgY29tcGFyaW5nIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfQk9EWV8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9IRUFSVF8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KS4gVGhpcyBhc3ltbWV0cnkgd2FzIGRyaXZlbiBieSByZXNwb25zZXMgdG8gdGhlIGFuaW1hdGUgYmVpbmdzIChhbmQgd2FzIHN1YnN0YW50aWFsbHkgbW9yZSBwcm9ub3VuY2VkIGZvciBgciBub256ZXJvX2Z1bihyZWd0YWIgPSByZWd0YWJfZDNfYWRfc2NvcmVkX2FkX2RpZmYsIHdoaWNoX3BhaXIgPSAiQk9EWSAtIEhFQVJUIiwgcG9zX25lZyA9ICJwb3MiKWApOyBhbW9uZyBpbmFuaW1hdGUgYmVpbmdzLCBkaWZmZXJlbmNlIHNjb3JlcyBob3ZlcmVkIGFyb3VuZCB6ZXJvIChhbmQgd2VyZSBzdWJzdGFudGlhbGx5IGxlc3MgcHJvbm91bmNlZCBmb3IgYHIgbm9uemVyb19mdW4ocmVndGFiID0gcmVndGFiX2QzX2FkX3Njb3JlZF9hZF9kaWZmLCB3aGljaF9wYWlyID0gIkJPRFkgLSBIRUFSVCIsIHBvc19uZWcgPSAibmVnIilgOyBzZWUgdGhlICJUYXJnZXQgY2hhcmFjdGVyIiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LnguCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpBcyBpbiBTdHVkaWVzIDEgYW5kIDIsIG9uIHRoZSB3aG9sZSwgZGlmZmVyZW5jZSBzY29yZXMgY29tcGFyaW5nIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzIHdlcmUgc3Vic3RhbnRpYWxseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIF9NSU5EXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0JPRFlfIGl0ZW1zIChzZWUgdGhlICJJbnRlcmNlcHQiIHJvdyBmb3IgdGhlICJCT0RZLU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KS4gSG93ZXZlciwgdGhpcyBhc3ltbWV0cnkgd2FzIGRyaXZlbiBieSByZXNwb25zZXMgdG8gdGhlIHR3byB0ZWNobm9sb2dpZXMgKHBhcnRpY3VsYXJseSB0aGUgYHIgbm9uemVyb19mdW4ocmVndGFiID0gcmVndGFiX2QzX2FkX3Njb3JlZF9hZF9kaWZmLCB3aGljaF9wYWlyID0gIkJPRFkgLSBNSU5EIiwgcG9zX25lZyA9ICJuZWciKWApLiBJdCB3YXMgbXVjaCBsZXNzIHByb25vdW5jZWTigJRhbmQgaW4gc29tZSBjYXNlcyByYW4gaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbuKAlGZvciBvdGhlciBjaGFyYWN0ZXJzIChwYXJ0aWN1bGFybHkgYHIgbm9uemVyb19mdW4ocmVndGFiID0gcmVndGFiX2QzX2FkX3Njb3JlZF9hZF9kaWZmLCB3aGljaF9wYWlyID0gIkJPRFkgLSBNSU5EIiwgcG9zX25lZyA9ICJwb3MiKWApOyBzZWUgdGhlICJUYXJnZXQgY2hhcmFjdGVyIiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQueC4gCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKQXMgaW4gU3R1ZGllcyAxIGFuZCAyLCBhbW9uZyBhZHVsdHMgaW4gU3R1ZHkgMiwgZGlmZmVyZW5jZSBzY29yZXMgY29tcGFyaW5nIHNjb3JlcyBvbiB0aGUgX0hFQVJUXyBhbmQgX01JTkRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9IRUFSVF8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KS4gQWdhaW4sIHRoaXMgYXN5bW1ldHJ5IHdhcyBtb3JlIHByb25vdW5jZWQgZm9yIHNvbWUgY2hhcmFjdGVycyAoYHIgbm9uemVyb19mdW4ocmVndGFiID0gcmVndGFiX2QzX2FkX3Njb3JlZF9hZF9kaWZmLCB3aGljaF9wYWlyID0gIkhFQVJUIC0gTUlORCIsIHBvc19uZWcgPSAibmVnIilgKSwgYW5kIGxlc3MgcHJvbm91bmNlZCBmb3Igb3RoZXJzIChuYW1lbHksIHRoZSB0d28gaW5lcnQgdG95czogYHIgbm9uemVyb19mdW4ocmVndGFiID0gcmVndGFiX2QzX2FkX3Njb3JlZF9hZF9kaWZmLCB3aGljaF9wYWlyID0gIkhFQVJUIC0gTUlORCIsIHBvc19uZWcgPSAicG9zIilgOyBzZWUgdGhlICJUYXJnZXQgY2hhcmFjdGVyIiByb3cgZm9yIHRoZSAiSEVBUlQtTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLiAKCiMjIyMjIEludGVyaW0gZGlzY3Vzc2lvbgoKVGhlc2UgZm9ybWFsIGFuYWx5c2VzIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGFjcm9zcyB0aGUgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjYWxlcyBhbW9uZyBhZHVsdHMgaW4gU3R1ZHkgMyBjb25maXJtIG15IGluZm9ybWF0aW9uIG9ic2VydmF0aW9ucyBvZiBhc3ltbWV0cmllcyBkZXNjcmliZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24sIGVjaG9pbmcgdGhlIGFuYWx5c2VzIG9mIGFkdWx0cyBpbiBTdHVkaWVzIDEgYW5kIDI6IEFjcm9zcyBhbGwgb2YgdGhlc2Ugc3R1ZGllcywgcGFydGljaXBhbnRzIHRlbmRlZCB0byBlbmRvcnNlIGJvdGggQk9EWSBhbmQgTUlORCBtb3JlIHN0cm9uZ2x5IHRoYW4gSEVBUlQsIHdoaWxlIHRoZSBhc3ltbWV0cnkgYmV0d2VlbiBNSU5EIGFuZCBCT0RZIHdhcyBjb250aW5nZW50IG9uIHRoZSB0eXBlIG9mIHRhcmdldCBjaGFyYWN0ZXIgdW5kZXIgY29uc2lkZXJhdGlvbi4KCiMjIyBDaGlsZHJlbiAoNy05eSkKClhYIF9fSU5TRVJUIFNFQ1RJT04gSU5UUk9EVUNUSU9OL1RSQU5TSVRJT05fXwoKYGBge3J9CiMganVzdCBmb3IgdGFibGUKc2NhbGVzX2VmYV93ZG1fZDNfNzkgPC0gc2NhbGVfZnVuKGVmYV93ZG1fZDNfNzksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2VmYV93ZG1fZDNfNzkpCnNhdmVSRFMoc2NhbGVzX2VmYV93ZG1fZDNfNzksIGZpbGUgPSAiLi9zdG9yZWQvc2NhbGVzL3NjYWxlc19lZmFfd2RtX2QzXzc5IikKYGBgCgpgYGB7cn0KZDNfNzlfc2NvcmVkX2FkIDwtIHNjb3JlX2Z1bihkM183OSwgc2NhbGVzX2VmYV93ZG1fZDNfYWQpCnNhdmVSRFMoZDNfNzlfc2NvcmVkX2FkLCBmaWxlID0gIi4vc3RvcmVkL3Njb3JlZF9kYXRhL2QzXzc5X3Njb3JlZF9hZCIpCmBgYAoKIyMjIyBWaXN1YWxpemF0aW9uCgpgYGB7cn0KcGxvdHNfZDNfNzlfc2NvcmVkX2FkIDwtIHJlbHZpel9mdW4oZDNfNzlfc2NvcmVkX2FkLCBjb2xvcnMgPSBjb2xvcnMwOSkKYGBgCgpgYGB7cn0KZmlnX2QzXzc5X3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kM183OV9zY29yZWRfYWRbWzFdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kM183OV9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kM183OV9zY29yZWRfYWRbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJCMSIsICJCMiIsICJCMyIpLCBuY29sID0gMykKCmZpZ19kM183OV9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19kM183OV9zY29yZWRfYWRbWzFdXSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCAKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczA5LAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczA5LAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpKQoKZmlnX2QzXzc5X3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlnX2QzXzc5X3Bsb3RzLCBmaWdfZDNfNzlfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlnX2QzXzc5X3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU3R1ZHkgMzogQ2hpbGRyZW4sIDctOXkgKHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDNfNzlfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDNfNzlfdGl0bGUsIGZpZ19kM183OV9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKZmlnX2QzXzc5X3Bsb3RzX2xlZ190aXRsZQpgYGAKClZpc3VhbGl6YXRpb25zIG9mIHJlbGF0aW9uc2hpcHMgYW1vbmcgc2NvcmVzIG9uIHRoZXNlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYXJlIHByb3ZpZGVkIGluIEZpZ3VyZSA0LngsIHJvdyBCLgoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkZpcnN0IEkgd2lsbCBjb25zaWRlciB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQk9EWSBhbmQgSEVBUlQgKEZpZ3VyZSA0LngsIHBhbmVsIEIxKS4gQXMgYW1vbmcgYWR1bHRzIGluIHRoaXMgc3R1ZHkgKHBhbmVsIEExKSwgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlcyBhcHBlYXJzIHRvIGJlIHNvbWV3aGF0IHBvc2l0aXZlLCBhbmQgdGhlcmUgYXBwZWFyIHRvIGJlIHNvbWV3aGF0IGZld2VyIGRhdGFwb2ludHMgYmVsb3cgdGhlIGxpbmUgb2YgZXF1aXZhbGVuY2UgKCR5ID0geCQsIGRvdHRlZCBkaWFnb25hbCBsaW5lKSB0aGFuIGFib3ZlIGl04oCUYnV0IGJvdGggb2YgdGhlc2Ugb2JzZXJ2YXRpb25zIGFyZSBtdWNoIGxlc3Mgc3RyaWtpbmcgYW1vbmcgY2hpbGRyZW4gdGhhbiB0aGV5IHdlcmUgYW1vbmcgYWR1bHRzLiBJbiBvdGhlciB3b3Jkcywgd2hpbGUgbWFueSBjaGlsZHJlbiBhdHRyaWJ1dGVkIG1vcmUgQk9EWSB0aGFuIEhFQVJUIHRvIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGluIHF1ZXN0aW9uIChsaWtlIHRoZSB2YXN0IG1ham9yaXR5IG9mIGFkdWx0cyksIHF1aXRlIGEgZmV3IGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBIRUFSVCB0aGFuIEJPRFkuIEZ1cnRoZXJtb3JlLCBhIHZpc3VhbCBpbnNwZWN0aW9uIG9mIHRoaXMgcGxvdCBzdWdnZXN0cyB0aGF0IHRoZSBhc3ltbWV0cnkgbWF5IGhhdmUgZXZlbiBnb25lIGluIG9wcG9zaXRlIGRpcmVjdGlvbnMgZm9yIGEgdGFyZ2V0IGNoYXJhY3RlciBvZiBwYXJ0aWN1bGFyIGludGVyZXN04oCUdGhlIHJvYm904oCUd2l0aCBjaGlsZHJlbiB0ZW5kaW5nIHRvIGF0dHJpYnV0ZSBtb3JlIEJPRFkgdGhhbiBIRUFSVCB0byB0aGlzIHVudXN1YWwgc29jaWFsIHBhcnRuZXIuCgpFY2hvaW5nIHRoZSB2aXN1YWxpemF0aW9ucyBvZiBhZHVsdHMnIHJlc3BvbnNlcywgdGhlcmUgZG8gYXBwZWFyIHRvIGJlIHR3byBzdWl0ZXMgb2YgY2hhcmFjdGVycyBpbiB0aGlzIHZpc3VhbGl6YXRpb246IGluYW5pbWF0ZSBvYmplY3RzIChjaGFyYWN0ZXJpemVkIGJ5IGdlbmVyYWxseSBsb3cgX0JPRFlfIHNjb3JlcykgYW5kIGFuaW1hdGUgYmVpbmdzIChjaGFyYWN0ZXJpemVkIGJ5IGdlbmVyYWxseSBoaWdoIF9CT0RZXyBzY29yZXMpLiBIb3dldmVyLCB3aGlsZSBhbW9uZyBhZHVsdHMgb25seSBhbmltYXRlIGJlaW5ncyB2YXJpZWQgaW4gdGhlaXIgbWVhbiBfSEVBUlRfIHNjb3JlcywgYW1vbmcgY2hpbGRyZW4gdGhlcmUgYXBwZWFycyB0byBiZSBzdWJzdGFudGlhbCB2YXJpYWJpbGl0eSBpbiBfSEVBUlRfIHNjb3JlcyBpbiBib3RoIG9mIHRoZXNlIGdyb3VwcyBvZiBjaGFyYWN0ZXJzLiBJbiBvdGhlciB3b3JkcywgdGhpcyB2aXN1YWxpemF0aW9uIGRvZXMgbm90IHByb3ZpZGUgZXZpZGVuY2Ugb2YgdGhlIGtpbmQgb2YgInRocmVzaG9sZCIgbW9kZWwgZGlzY3Vzc2VkIGZvciBhZHVsdHMuCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpOZXh0IEkgd2lsbCBjb25zaWRlciB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQk9EWSBhbmQgTUlORCAoRmlndXJlIDQueCwgcGFuZWwgQjIpLiBBbW9uZyBhZHVsdHMsIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9NSU5EXyBzY2FsZXMgd2FzIGNsZWFybHkgcG9zaXRpdmUsIGFuZCB0aGVyZSB3ZXJlIG5vdGFibHkgZmV3ZXIgZGF0YXBvaW50cyBiZWxvdyB0aGUgbGluZSBvZiBlcXVpdmFsZW5jZSAoJHkgPSB4JCwgZG90dGVkIGRpYWdvbmFsIGxpbmUpIHRoYW4gYWJvdmUgaXTigJRidXQgbmVpdGhlciBvZiB0aGVzZSBvYnNlcnZhdGlvbnMgaXMgcGFydGljdWxhcmx5IHN0cmlraW5nIGFtb25nIGNoaWxkcmVuIGluIHRoaXMgc2FtcGxlLiBJbiBvdGhlciB3b3Jkcywgd2hpbGUgc29tZSBjaGlsZHJlbiBhdHRyaWJ1dGVkIG1vcmUgQk9EWSB0aGFuIEhFQVJUIHRvIHRoZSB0YXJnZXQgY2hhcmFjdGVyIGluIHF1ZXN0aW9uIChwYXJ0aWN1bGFybHkgaWYgdGhleSB3ZXJlIGV2YWx1YXRpbmcgb25lIG9mIHRoZSB0d28gdGVjaG5vbG9naWVzKSwgb3RoZXJzIGF0dHJpYnV0ZWQgbW9yZSBIRUFSVCB0aGFuIEJPRFkgKHBhcnRpY3VsYXJseSBpZiB0aGV5IHdlcmUgZXZhbHVhdGluZyBvbmUgb2YgYW5pbWF0ZSBiZWluZ3MpLiBUaGlzIGVjaG9lcyB0aGUgZGlmZmVyZW5jZXMgYWNyb3NzIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmVuZ3RoIGFuZCBkaXJlY3Rpb24gb2YgYXN5bW1ldHJpZXMgYmV0d2VlbiBfQk9EWV8gYW5kIF9NSU5EXyBvYnNlcnZlZCBhbW9uZyBhZHVsdHMgaW4gdGhpcyBzdHVkeTsgaW5kZWVkLCBzdWNoIGJldHdlZW4tY2hhcmFjdGVyIGRpZmZlcmVuY2VzIGFwcHBlYXIgdG8gYmUgZXZlbiBtb3JlIHByb25vdW5jZWQgYW1vbmcgY2hpbGRyZW4uCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKRmluYWxseSBJIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEhFQVJUIGFuZCBNSU5EIChGaWd1cmUgNC54LCBwYW5lbCBCMykuIEFzIGFtb25nIGFkdWx0cyBpbiB0aGlzIHN0dWR5IChwYW5lbCBBMyksIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzY29yZXMgb24gdGhlIF9IRUFSVF8gYW5kIF9NSU5EXyBzY2FsZXMgYXBwZWFycyB0byBiZSBzb21ld2hhdCBwb3NpdGl2ZSwgYW5kIHRoZXJlIGFwcGVhciB0byBiZSBzb21ld2hhdCBmZXdlciBkYXRhcG9pbnRzIGJlbG93IHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkLCBkb3R0ZWQgZGlhZ29uYWwgbGluZSkgdGhhbiBhYm92ZSBpdOKAlGJ1dCBhZ2FpbiBib3RoIG9mIHRoZXNlIG9ic2VydmF0aW9ucyBhcmUgbXVjaCBsZXNzIHN0cmlraW5nIGFtb25nIGNoaWxkcmVuIHRoYW4gdGhleSB3ZXJlIGFtb25nIGFkdWx0cy4gSW4gb3RoZXIgd29yZHMsIHdoaWxlIG1hbnkgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIE1JTkQgdGhhbiBIRUFSVCB0byB0aGUgdGFyZ2V0IGNoYXJhY3RlciBpbiBxdWVzdGlvbiAobGlrZSB0aGUgdmFzdCBtYWpvcml0eSBvZiBhZHVsdHMpLCBxdWl0ZSBhIGZldyBjaGlsZHJlbiBhdHRyaWJ1dGVkIG1vcmUgSEVBUlQgdGhhbiBNSU5ELiAKQW4gYW5hbHlzaXMgb2YgbWVhbiBzY29yZXMgYnkgdGFyZ2V0IGNoYXJhY3RlciByZXZlYWxzIG5vIGV2aWRlbmNlIG9mIHRoZSBraW5kIG9mICJ0aHJlc2hvbGQiIG1vZGVsIGRpc2N1c3NlZCBmb3IgYWR1bHRzLgoKIyMjIyMgSW50ZXJpbSBkaXNjdXNzaW9uCgpBcyBpbiB0aGUgY29tcGFyaXNvbiBvZiBhZHVsdHMgYW5kIGNoaWxkcmVuIGluIFN0dWR5IDIsIG15IGluZm9ybWFsIG9ic2VydmF0aW9ucyBvZiB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyBvbGRlciBjaGlsZHJlbidzIGVuZG9yc2VtZW50cyBvZiB0aGUgdGhlIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZHkgMyBhcmUgYnJvYWRseSBzaW1pbGFyIHRvIHRob3NlIG9mIGFkdWx0cyBpbiB0aGlzIHN0dWR5LCBidXQgZHJhbWF0aWNhbGx5IGF0dGVudWF0ZWQ6ICgxKSBUaGVzZSBpbnRlci11bml0IHJlbGF0aW9uc2hpcHMgd2VyZSB3aGF0IHBvc2l0aXZlLCBidXQgb25seSBzb21ld2hhdDsgYW5kICgyKSBUaGVyZSB3YXMgc29tZSBldmlkZW5jZSBvZiBhc3ltbWV0cmllcyBpbiB0aGVzZSBwb3NpdGl2ZSByZWxhdGlvbnNoaXBzLCBidXQgdGhlc2UgYXN5bW1ldHJpZXMgd2VyZSBnZW5lcmFsbHkgd2Vha2VyIGFuZCBhcHBlYXJlZCB0byBiZSBoaWdobHkgZGVwZW5kZW50IG9uIHdoaWNoIHRhcmdldCBjaGFyYWN0ZXIgcGFydGljaXBhbnRzIGFzc2Vzc2VkIChwYXJ0aWN1bGFybHkgZm9yIHRoZSBCT0RZIHZzLiBIRUFSVCBhbmQgQk9EWSB2cy4gTUlORCBjb21wYXJpc29ucykuCgojIyMjIEFuYWx5c2lzIG9mIGFzeW1tZXRyaWVzCgpIZXJlIEkgcHJvdmlkZSBhIGZvcm1hbCBhbmFseXNpcyBvZiB0aGUgYXN5bW1ldHJpZXMgcmV2ZWFsZWQgYnkgdGhlIHZpc3VhbGl6YXRpb25zIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLiBGb3IgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKEJPRFkgdnMuIEhFQVJULCBCT0RZIHZzLiBNSU5ELCBhbmQgSEVBUlQgdnMuIE1JTkQpLCBJIHVzZWQgQmF5ZXNpYW4gcmVncmVzc2lvbiB0byBjb21wYXJlIGRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gdGhlc2UgdHdvIGNvbmNlcHR1YWwgdW5pdHMgdG8gemVybywgY29udHJvbGxpbmcgZm9yIGRpZmZlcmVuY2VzIGluIGFzc2Vzc21lbnRzIG9mIHRoZSBuaW5lICJkaXZlcnNlIGNoYXJhY3RlcnMiIHRoYXQgd2VyZSBmZWF0dXJlZCBhcyB0YXJnZXQgY2hhcmFjdGVycyBpbiB0aGVzZSBzdHVkaWVzLiBTZWUgRmlndXJlIDQueCwgcGFuZWwgQiwgZm9yIHZpc3VhbCBkZXBpY3Rpb25zIG9mIHRoZXNlIGRpZmZlcmVuY2Ugc2NvcmVzLgoKYGBge3J9CmQzXzc5X3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfZnVuKGQzXzc5X3Njb3JlZF9hZCkKY29udHJhc3RzKGQzXzc5X3Njb3JlZF9hZF9kaWZmJGNoYXJhY3RlcikgPC0gY29udHJhc3RzX3N1bV9kdjA5CgpzYXZlUkRTKGQzXzc5X3Njb3JlZF9hZF9kaWZmLCAiLi9zdG9yZWQvZGlmZnNjb3JlX2RhdGEvZDNfNzlfc2NvcmVkX2FkX2RpZmYiKQpgYGAKCmBgYHtyfQpwbG90X2QzXzc5X3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZwbG90X2Z1bihkM183OV9zY29yZWRfYWRfZGlmZiwgY29sb3JzID0gY29sb3JzMDkpCmBgYAoKYGBge3J9CiMgcl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQzXzc5X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QzXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2QzXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDNfNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKcl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKc3VtbWFyeShyX2QzXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2QzXzc5X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDNfNzlfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzXzc5X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKcl9kM183OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDNfNzlfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCkKYGBgCgpgYGB7cn0KcmVndGFiX2QzXzc5X3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfcmVnX3RhYmxlX2Z1bigKICByZWdfbGlzdCA9IGxpc3Qocl9kM183OV9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2QzXzc5X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKICAgICAgICAgICAgICAgICAgcl9kM183OV9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKSwKICBwYWlyX2xpc3QgPSBjKCJCT0RZIC0gSEVBUlQiLCAiQk9EWSAtIE1JTkQiLCAiSEVBUlQgLSBNSU5EIiksCiAgc3R1ZHlfbmFtZSA9ICJDaGlsZHJlbiwgNy05eSAodXNpbmcgYWR1bHRzJyBzY2FsZXMpIiwKICBjaGFyX2xhYmVsID0gYygiRWxlcGhhbnQgdnMuIEdNIiwgIkdvYXQgdnMuIEdNIiwgIk1vdXNlIHZzLiBHTSIsCiAgICAgICAgICAgICAgICAgIkJpcmQgdnMuIEdNIiwgIkJlZXRsZSB2cy4gR00iLCAiVGVkZHkgYmVhciB2cy4gR00iLAogICAgICAgICAgICAgICAgICJEb2xsIHZzLiBHTSIsICJSb2JvdCB2cy4gR00iKSkKYGBgCgpgYGB7cn0KIyBpbnRlcmltIHRhYmxlIGZvciBlYXNlIG9mIHdyaXRpbmcKcmVndGFiX2QzXzc5X3Njb3JlZF9hZF9kaWZmICU+JQogIHNlbGVjdCgtc3R1ZHksIC1zLmUuKSAlPiUKICBmaWx0ZXIocGFyYW0gPT0gIkludGVyY2VwdCIpICU+JQogIGthYmxlKGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCnBsb3RfZDNfNzlfc2NvcmVkX2FkX2RpZmYKYGBgCgojIyMjIyBCT0RZIHZzLiBIRUFSVAoKQXMgYW1vbmcgYWR1bHRzLCBkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9IRUFSVF8gc2NhbGVzIHdlcmUgc3Vic3RhbnRpYWxseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIF9CT0RZXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0hFQVJUXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLiBMaWtlIGFkdWx0cywgb2xkZXIgY2hpbGRyZW4ncyBhc3ltbWV0cnkgd2FzIGRyaXZlbiBieSByZXNwb25zZXMgdG8gdGhlIGFuaW1hdGUgYmVpbmdzIChhbmQgd2FzIHN1YnN0YW50aWFsbHkgbW9yZSBwcm9ub3VuY2VkIGZvciBgciBub256ZXJvX2Z1bihyZWd0YWIgPSByZWd0YWJfZDNfNzlfc2NvcmVkX2FkX2RpZmYsIHdoaWNoX3BhaXIgPSAiQk9EWSAtIEhFQVJUIiwgcG9zX25lZyA9ICJwb3MiKWApOyBhbW9uZyBpbmFuaW1hdGUgYmVpbmdzLCBkaWZmZXJlbmNlIHNjb3JlcyBob3ZlcmVkIGFyb3VuZCAob3IgYmVsb3cpIHplcm8gKGFuZCB3ZXJlIHN1YnN0YW50aWFsbHkgbGVzcyBwcm9ub3VuY2VkIGZvciBgciBub256ZXJvX2Z1bihyZWd0YWIgPSByZWd0YWJfZDNfNzlfc2NvcmVkX2FkX2RpZmYsIHdoaWNoX3BhaXIgPSAiQk9EWSAtIEhFQVJUIiwgcG9zX25lZyA9ICJuZWciKWA7IHNlZSB0aGUgIlRhcmdldCBjaGFyYWN0ZXIiIHJvdyBmb3IgdGhlICJCT0RZLUhFQVJUIiBjb21wYXJpc29uIGluIFRhYmxlIDQueC4KCiMjIyMjIEJPRFkgdnMuIE1JTkQKCkRpZmZlcmVuY2Ugc2NvcmVzIGNvbXBhcmluZyBzY29yZXMgb24gdGhlIF9CT0RZXyBhbmQgX01JTkRfIHNjYWxlcyB3ZXJlIG5vdCBzdWJzdGFudGlhbGx5IGRpZmZlcmVudCBmcm9tIHplcm8sIGluIGNvbnRyYXN0IHRvIGFuYWx5c2VzIG9mIGFkdWx0cyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQueCkuIFRoaXMgYXBwZWFycyB0byBiZSBkdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGUgYXN5bW1ldHJ5IHdlbnQgaW4gZGlmZmVyZW50IGRpcmVjdGlvbnMgZm9yIGRpZmZlcmVudCBjaGFyYWN0ZXJzOiBPbGRlciBjaGlsZHJlbiB0ZW5kZWQgdG8gYXR0cmlidXRlZCBtb3JlIE1JTkQgdGhhbiBCT0RZIHQgdGhlIHR3byB0ZWNobm9sb2dpZXMgKHJvYm90LCBjb21wdXRlciksIGJ1dCB0ZW5kZWQgdG8gYXR0cmlidXRlZCBtb3JlIEJPRFkgdGhhbiBNSU5EIHRvIHRoZSBhbmltYXRlIGJlaW5ncyAocGFydGljdWxhcmx5IGByIG5vbnplcm9fZnVuKHJlZ3RhYiA9IHJlZ3RhYl9kM183OV9zY29yZWRfYWRfZGlmZiwgd2hpY2hfcGFpciA9ICJCT0RZIC0gTUlORCIsIHBvc19uZWcgPSAicG9zIilgKTsgc2VlIHRoZSAiVGFyZ2V0IGNoYXJhY3RlciIgcm93IGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LnguIAoKIyMjIyMgSEVBUlQgdnMuIE1JTkQKCkFzIGFtb25nIGFkdWx0cywgZGlmZmVyZW5jZSBzY29yZXMgY29tcGFyaW5nIHNjb3JlcyBvbiB0aGUgX0hFQVJUXyBhbmQgX01JTkRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgY2hpbGRyZW4gZW5kb3JzaW5nIF9NSU5EXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0hFQVJUXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiSEVBUlQtTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLiBUaGlzIGFzeW1tZXRyeSBhcHBlYXJlZCB0byBob2xkIHRydWUgYWNyb3NzIHRoZSByYW5nZSBvZiB0YXJnZXQgY2hhcmFjdGVycyBpbmNsdWRlZCBpbiB0aGlzIHN0dWR5LCAgYW5kIGxlc3MgcHJvbm91bmNlZCBmb3Igb3RoZXJzOyBzZWUgdGhlICJUYXJnZXQgY2hhcmFjdGVyIiByb3cgZm9yIHRoZSAiSEVBUlQtTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LnguIAoKIyMjIyMgSW50ZXJpbSBkaXNjdXNzaW9uCgpUaGVzZSBmb3JtYWwgYW5hbHlzZXMgb2YgZGlmZmVyZW5jZSBzY29yZXMgYWNyb3NzIHRoZSBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NhbGVzIGFtb25nIG9sZGVyIGNoaWxkcmVuICg3LTl5KSBpbiBTdHVkeSAzIGNvbmZpcm0gbXkgaW5mb3JtYWwgb2JzZXJ2YXRpb25zIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uOiBPbGRlciBjaGlsZHJlbiB0ZW5kZWQgdG8gZW5kb3JzZSBib3RoIEJPRFkgYW5kIE1JTkQgbW9yZSBzdHJvbmdseSB0aGFuIEhFQVJULCB3aGlsZSB0aGUgYXN5bW1ldHJ5IGJldHdlZW4gTUlORCBhbmQgQk9EWSB3YXMgaGlnaGx5IGNvbnRpbmdlbnQgb24gdGhlIHR5cGUgb2YgdGFyZ2V0IGNoYXJhY3RlciB1bmRlciBjb25zaWRlcmF0aW9uLgoKIyMjIENoaWxkcmVuICg0LTZ5KQoKWFggX19JTlNFUlQgU0VDVElPTiBJTlRST0RVQ1RJT04vVFJBTlNJVElPTl9fCgpgYGB7cn0KZDNfNDZfc2NvcmVkX2FkIDwtIHNjb3JlX2Z1bihkM180Niwgc2NhbGVzX2VmYV93ZG1fZDNfYWQpCnNhdmVSRFMoZDNfNDZfc2NvcmVkX2FkLCBmaWxlID0gIi4vc3RvcmVkL3Njb3JlZF9kYXRhL2QzXzQ2X3Njb3JlZF9hZCIpCmBgYAoKIyMjIyBWaXN1YWxpemF0aW9uCgpgYGB7cn0KcGxvdHNfZDNfNDZfc2NvcmVkX2FkIDwtIHJlbHZpel9mdW4oZDNfNDZfc2NvcmVkX2FkLCBjb2xvcnMgPSBjb2xvcnMwOSkKYGBgCgpgYGB7cn0KZmlnX2QzXzQ2X3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kM180Nl9zY29yZWRfYWRbWzFdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kM180Nl9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kM180Nl9zY29yZWRfYWRbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDMSIsICJDMiIsICJDMyIpLCBuY29sID0gMykKCmZpZ19kM180Nl9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19kM180Nl9zY29yZWRfYWRbWzFdXSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCAKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczA5LAogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNvbG9yczA5LAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gOSkpKQoKZmlnX2QzXzQ2X3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoZmlnX2QzXzQ2X3Bsb3RzLCBmaWdfZDNfNDZfbGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlnX2QzXzQ2X3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiU3R1ZHkgMzogQ2hpbGRyZW4sIDQtNnkgKHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDNfNDZfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDNfNDZfdGl0bGUsIGZpZ19kM180Nl9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKZmlnX2QzXzQ2X3Bsb3RzX2xlZ190aXRsZQpgYGAKClZpc3VhbGl6YXRpb25zIG9mIHJlbGF0aW9uc2hpcHMgYW1vbmcgc2NvcmVzIG9uIHRoZXNlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYXJlIHByb3ZpZGVkIGluIEZpZ3VyZSA0LngsIHJvdyBDLgoKSW4gY29udHJhc3QgdG8gdGhlIHZpc3VhbGl6YXRpb25zIG9mIHRoZXNlIHJlbGF0aW9uc2hpcHMgYW1vbmcgYWR1bHRzIGFuZCBvbGRlciBjaGlsZHJlbiAoNy05eSBvZiBhZ2UpLCBhbW9uZyB5b3VuZ2VyIGNoaWxkcmVuIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gQk9EWSwgSEVBUlQsIGFuZCBNSU5EIChhcyBpbmRleGVkIGJ5IGFkdWx0cycgc2NhbGVzKSBhbGwgbG9va2VkIHJhdGhlciBzaW1pbGFyLiBJbiBwYXJ0aWN1bGFyLCBmb3IgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMsIHRoZXJlIGFwcGVhcmVkIHRvIGJlIGEgc29tZXdoYXQgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmVzIG9uIHRoZSB0d28gc2NhbGVzOyB0aGlzIGFsaWducyB3aXRoIG15IGluZm9ybWFsIG9ic2VydmF0aW9ucyBvZiBhZHVsdHMgYW5kIG9sZGVyIGNoaWxkcmVuLiBJbiBlYWNoIGNhc2UgKHBhcnRpY3VsYXJseSBpbiB0aGUgQk9EWSB2cy4gSEVBUlQgYW5kIEJPRFkgdnMuIE1JTkQgY29tcGFyaXNvbnMpLCB0d28gc3VpdGVzIG9mIGNoYXJhY3RlcnMgZW1lcmdlZDogQSBncm91cCBvZiBpbmFuaW1hdGUgb2JqZWN0cyAod2hpY2gsIGluIHRoZSBhZ2dyZWdhdGUsIHJlY2VpdmVkIG1vZGVyYXRlbHkgbG93IHNjb3JlcyBvbiBhbGwgc2NhbGVzKSwgYW5kIGEgZ3JvdXAgb2YgYW5pbWF0ZSBiZWluZ3MgKHdoaWNoLCBpbiB0aGUgYWdncmVnYXRlLCByZWNlaXZlZCBtb2RlcmF0ZWx5IGhpZ2ggc2NvcmVzIG9uIGFsbCBzY2FsZXMpLgoKQW4gaW5mb3JtYWwgaW5zcGVjdGlvbiBvZiB0aGVzZSB2aXN1YWxpemF0aW9ucyBzdWdnZXN0cyBvbmx5IG1vZGVyYXRlIGFzeW1tZXRyaWVzIGluIHlvdW5nZXIgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgb2YgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIGNhcGFjaXRpZXMuIEluIHRoZSBjYXNlIG9mIEJPRFkgdnMuIEhFQVJULCB5b3VuZ2VyIGNoaWxkcmVuIHRlbmRlZCB0byBhdHRyaWJ1dGUgbW9yZSBCT0RZIHRoYW4gSEVBUlQgKHBhbmVsIEMxKSwgYnV0IHRoaXMgdGVuZGVuY3kgd2FzIHF1aXRlIHdlYWsuIEluIHRoZSBjYXNlIG9mIEJPRFkgdnMuIE1JTkQgKHBhbmVsIEMyKSwgeW91bmdlciBjaGlsZHJlbidzIHRlbmRlZCAoYWdhaW4sIHdlYWtseSkgdG8gYXR0cmlidXRlIG1vcmUgQk9EWSB0aGFuIE1JTkTigJR0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uIG9mIGFkdWx0cyBhbmQgb2xkZXIgY2hpbGRyZW4uIEluIHRoZSBjYXNlIG9mIEhFQVJUIHZzLiBNSU5ELCB0aGlzIHZpc3VhbGlhdGlvbiAocGFuZWwgQzMpIHN1Z2dlc3RzIG5vIHN5c3RlbWF0aWMgYXN5bW1ldHJ5IGluIHlvdW5nZXIgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMuCgojIyMjIEFuYWx5c2lzIG9mIGFzeW1tZXRyaWVzCgpIZXJlIEkgcHJvdmlkZSBhIGZvcm1hbCBhbmFseXNpcyBvZiB0aGUgYXN5bW1ldHJpZXMgKG9yIGxhY2sgdGhlcmVvZikgcmV2ZWFsZWQgYnkgdGhlIHZpc3VhbGl6YXRpb25zIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLiBGb3IgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKEJPRFkgdnMuIEhFQVJULCBCT0RZIHZzLiBNSU5ELCBhbmQgSEVBUlQgdnMuIE1JTkQpLCBJIHVzZWQgQmF5ZXNpYW4gcmVncmVzc2lvbiB0byBjb21wYXJlIGRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gdGhlc2UgdHdvIGNvbmNlcHR1YWwgdW5pdHMgdG8gemVybywgY29udHJvbGxpbmcgZm9yIGRpZmZlcmVuY2VzIGluIGFzc2Vzc21lbnRzIG9mIHRoZSBuaW5lICJkaXZlcnNlIGNoYXJhY3RlcnMiIHRoYXQgd2VyZSBmZWF0dXJlZCBhcyB0YXJnZXQgY2hhcmFjdGVycyBpbiB0aGVzZSBzdHVkaWVzLiBTZWUgRmlndXJlIDQueCwgcGFuZWwgQywgZm9yIHZpc3VhbCBkZXBpY3Rpb25zIG9mIHRoZXNlIGRpZmZlcmVuY2Ugc2NvcmVzLgoKYGBge3J9CmQzXzQ2X3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfZnVuKGQzXzQ2X3Njb3JlZF9hZCkKY29udHJhc3RzKGQzXzQ2X3Njb3JlZF9hZF9kaWZmJGNoYXJhY3RlcikgPC0gY29udHJhc3RzX3N1bV9kdjA5CgpzYXZlUkRTKGQzXzQ2X3Njb3JlZF9hZF9kaWZmLCAiLi9zdG9yZWQvZGlmZnNjb3JlX2RhdGEvZDNfNDZfc2NvcmVkX2FkX2RpZmYiKQpgYGAKCmBgYHtyfQpwbG90X2QzXzQ2X3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZwbG90X2Z1bihkM180Nl9zY29yZWRfYWRfZGlmZiwgY29sb3JzID0gY29sb3JzMDkpCmBgYAoKYGBge3J9CiMgcl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyLAojICAgZGF0YSA9IGQzXzQ2X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDNfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKcl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKc3VtbWFyeShyX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIsCiMgICBkYXRhID0gZDNfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKcl9kM180Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDNfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCkKYGBgCgpgYGB7cn0KcmVndGFiX2QzXzQ2X3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfcmVnX3RhYmxlX2Z1bigKICByZWdfbGlzdCA9IGxpc3Qocl9kM180Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2QzXzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKICAgICAgICAgICAgICAgICAgcl9kM180Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKSwKICBwYWlyX2xpc3QgPSBjKCJCT0RZIC0gSEVBUlQiLCAiQk9EWSAtIE1JTkQiLCAiSEVBUlQgLSBNSU5EIiksCiAgc3R1ZHlfbmFtZSA9ICJDaGlsZHJlbiwgNC02eSAodXNpbmcgYWR1bHRzJyBzY2FsZXMpIiwKICBjaGFyX2xhYmVsID0gYygiRWxlcGhhbnQgdnMuIEdNIiwgIkdvYXQgdnMuIEdNIiwgIk1vdXNlIHZzLiBHTSIsCiAgICAgICAgICAgICAgICAgIkJpcmQgdnMuIEdNIiwgIkJlZXRsZSB2cy4gR00iLCAiVGVkZHkgYmVhciB2cy4gR00iLAogICAgICAgICAgICAgICAgICJEb2xsIHZzLiBHTSIsICJSb2JvdCB2cy4gR00iKSkKYGBgCgpgYGB7cn0KIyBpbnRlcmltIHRhYmxlIGZvciBlYXNlIG9mIHdyaXRpbmcKcmVndGFiX2QzXzQ2X3Njb3JlZF9hZF9kaWZmICU+JQogIHNlbGVjdCgtc3R1ZHksIC1zLmUuKSAlPiUKICBmaWx0ZXIocGFyYW0gPT0gIkludGVyY2VwdCIpICU+JQogIGthYmxlKGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCnBsb3RfZDNfNDZfc2NvcmVkX2FkX2RpZmYKYGBgCgojIyMjIyBCT0RZIHZzLiBIRUFSVAoKQXMgYW1vbmcgYWR1bHRzIGFuZCBvbGRlciBjaGlsZHJlbiwgZGlmZmVyZW5jZSBzY29yZXMgY29tcGFyaW5nIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfQk9EWV8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9IRUFSVF8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KS4gQXMgd2l0aCBhZHVsdHMgYW5kIG9sZGVyIGNoaWxkcmVuLCB0aGlzIGFzeW1tZXRyeSBhcHBlYXJzIHRvIGhhdmUgYmVlbiBkcml2ZW4gYnkgcmVzcG9uc2VzIHRvIHRoZSBhbmltYXRlIGJlaW5ncywgd2hpbGUgZGlmZmVyZW5jZSBzY29yZXMgZm9yIGluYW5pbWF0ZSBiZWluZ3MgaG92ZXJlZCBhcm91bmQgKG9yIGJlbG93KSB6ZXJvOyBzZWUgdGhlICJUYXJnZXQgY2hhcmFjdGVyIiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LnguCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpEaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9IRUFSVF8gc2NhbGVzIHdlcmUgc3Vic3RhbnRpYWxseSBub24temVyb+KAlGJ1dCBpbiBjb250cmFzdHMgdG8gb2xkZXIgY2hpbGRyZW4gYW5kIGFkdWx0cywgYW1vbmcgeW91bmdlciBjaGlsZHJlbiB0aGlzIGFzeW1tZXRyeSByYW4gaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgYXR0cmlidXRpbmcgbW9yZSBfQk9EWV8gdGhhbiBfTUlORF8gKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLiBUaGlzIGFzeW1tZXRyeSBhcHBlYXJzIHRvIGhhdmUgYmVlbiBkcml2ZW4gYnkgcmVzcG9uc2VzIHRvIGFuaW1hdGUgYmVpbmdzIChhbmQgd2FzIHBhcnRpY3VsYXJseSBwcm9ub3VuY2VkIGZvciBwYXJ0aWN1bGFybHkgYHIgbm9uemVyb19mdW4ocmVndGFiID0gcmVndGFiX2QzXzQ2X3Njb3JlZF9hZF9kaWZmLCB3aGljaF9wYWlyID0gIkJPRFkgLSBNSU5EIiwgcG9zX25lZyA9ICJwb3MiKWApOyBzZWUgdGhlICJUYXJnZXQgY2hhcmFjdGVyIiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQueC4gCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKSW4gY29udHJhc3QgdG8gYWR1bHRzIGFuZCBvbGRlciBjaGlsZHJlbiwgYW1vbmcgeW91bmdlciBjaGlsZHJlbiBkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgc2NvcmVzIG9uIHRoZSBfSEVBUlRfIGFuZCBfTUlORF8gc2NhbGVzIGRpZCBub3QgZGlmZmVyIHN1YnN0YW50aWFsbHkgZnJvbSB6ZXJvLCBhbmQgdmFyaWVkIG9ubHkgc3VidGx5IGFjcm9zcyB0YXJnZXQgY2hhcmFjdGVyczsgc2VlIHRoZSAiVGFyZ2V0IGNoYXJhY3RlciIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54LiAKCiMjIyMjIEludGVyaW0gZGlzY3Vzc2lvbgoKVGhlc2UgZm9ybWFsIGFuYWx5c2VzIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGFjcm9zcyB0aGUgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjYWxlcyBhbW9uZyB5b3VuZ2VyIGNoaWxkcmVuICg0LTZ5KSBpbiBTdHVkeSAzIGNvbmZpcm0gbXkgaW5mb3JtYWwgb2JzZXJ2YXRpb25zIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLiBMaWtlIG9sZGVyIGNoaWxkcmVuIGFuZCBhZHVsdHMsIHlvdW5nZXIgY2hpbGRyZW4gdGVuZGVkIHRvIGVuZG9yc2UgQk9EWSBtb3JlIHN0cm9uZ2x5IHRoYW4gSEVBUlQuIEhvd2V2ZXIsIHlvdW5nZXIgY2hpbGRyZW4gZGl2ZXJnZWQgZnJvbSB0aGVpciBvbGRlciBjb3VudGVycGFydHMgYnkgc3lzdGVtYXRpY2FsbHkgZW5kb3JzaW5nIEJPRFkgbW9yZSBzdHJvbmdseSB0aGFuIE1JTkQsIGFuZCBieSBmYWlsaW5nIHRvIHNob3cgYW55IHN5c3RlbWF0aWMgYXN5bW1ldHJ5IGJldHdlZW4gSEVBUlQgYW5kIE1JTkQuCgojIyMgRGV2ZWxvcG1lbnRhbCBjb21wYXJpc29uCgpJbiB0aGUgcHJldmlvdXMgc2VjdGlvbnMsIEkgYW5hbHl6ZWQgYWR1bHRzJywgb2xkZXIgY2hpbGRyZW4ncywgYW5kIHlvdW5nZXIgY2hpbGRyZW4ncyByZXNwb25zZXMgc2VwYXJhdGVseS4gSGVyZSBJIGNvbmR1Y3QgYSBmb3JtYWwgY29tcGFyaXNvbiBvZiBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIGNvbmNlcHR1YWwgdW5pdHMgYW1vbmcgdGhlc2UgdGhyZWUgYWdlIGdyb3VwcywgdG8gYXNzZXNzIHRoZSBzaXplIGFuZCByb2J1c3RuZXNzIG9mIHRoZXNlIG9zdGVuc2l2ZSBkZXZlbG9wbWVudGFsIGRpZmZlcmVuY2VzLgoKYGBge3J9CmQzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZiA8LSBkM19hZF9zY29yZWRfYWRfZGlmZiAlPiUKICBmdWxsX2pvaW4oZDNfNzlfc2NvcmVkX2FkX2RpZmYpICU+JQogIGZ1bGxfam9pbihkM180Nl9zY29yZWRfYWRfZGlmZikgJT4lCiAgbXV0YXRlKGFnZV9ncm91cCA9IGZhY3RvcihhZ2VfZ3JvdXApKQpjb250cmFzdHMoZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmJGNoYXJhY3RlcikgPC0gY29udHJhc3RzX3N1bV9kdjA5CmNvbnRyYXN0cyhkM19hZDc5NDZfc2NvcmVkX2FkX2RpZmYkYWdlX2dyb3VwKSA8LSBjb250cmFzdHNfZHVtM19hZ2VncApgYGAKCmBgYHtyfQojIHJfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKiBhZ2VfZ3JvdXAsCiMgICBkYXRhID0gZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKcl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnN1bW1hcnkocl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKiBhZ2VfZ3JvdXAsCiMgICBkYXRhID0gZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQiKQoKcl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpzdW1tYXJ5KHJfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCkKYGBgCgpgYGB7cn0KIyByX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyICogYWdlX2dyb3VwLAojICAgZGF0YSA9IGQzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkhFQVJUIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnJfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpCmBgYAoKYGBge3J9CnJlZ3RhYl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9yZWdfdGFibGVfZnVuKAogIHJlZ19saXN0ID0gbGlzdChyX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiAgICAgICAgICAgICAgICAgIHJfZDNfYWQ3OTQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpLAogIHBhaXJfbGlzdCA9IGMoIkJPRFkgLSBIRUFSVCIsICJCT0RZIC0gTUlORCIsICJIRUFSVCAtIE1JTkQiKSwKICBzdHVkeV9uYW1lID0gIkRldmVsb3BtZW50YWwgY29tcGFyaXNvbiIsCiAgY2hhcl9sYWJlbCA9IGMoIkVsZXBoYW50IHZzLiBHTSIsICJHb2F0IHZzLiBHTSIsICJNb3VzZSB2cy4gR00iLAogICAgICAgICAgICAgICAgICJCaXJkIHZzLiBHTSIsICJCZWV0bGUgdnMuIEdNIiwgIlRlZGR5IGJlYXIgdnMuIEdNIiwKICAgICAgICAgICAgICAgICAiRG9sbCB2cy4gR00iLCAiUm9ib3QgdnMuIEdNIiksIAogIGFnZWdwX2xhYmVsID0gYygiT2xkZXIgY2hpbGRyZW4gdnMuIGFkdWx0cyIsIAogICAgICAgICAgICAgICAgICAiWW91bmdlciBjaGlsZHJlbiB2cy4gYWR1bHRzIikpCmBgYAoKYGBge3J9CiMgaW50ZXJpbSB0YWJsZSBmb3IgZWFzZSBvZiB3cml0aW5nCnJlZ3RhYl9kM19hZDc5NDZfc2NvcmVkX2FkX2RpZmYgJT4lCiAgc2VsZWN0KC1zdHVkeSwgLXMuZS4pICU+JQogIGZpbHRlcihwYXJhbSA9PSAiSW50ZXJjZXB0IiB8IGdyZXBsKCJjaGlsZHJlbiIsIHRvbG93ZXIocGFyYW0pKSkgJT4lCiAgZmlsdGVyKCFncmVwbCgiXFwqIiwgcGFyYW0pKSAlPiUgIyByZW1vdmUgaW50ZXJhY2F0aW9ucwogIGthYmxlKGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCnBsb3RfZ3JpZChwbG90X2QzX2FkX3Njb3JlZF9hZF9kaWZmLCAKICAgICAgICAgIHBsb3RfZDNfNzlfc2NvcmVkX2FkX2RpZmYsIAogICAgICAgICAgcGxvdF9kM180Nl9zY29yZWRfYWRfZGlmZiwgCiAgICAgICAgICBuY29sID0gMykKYGBgCgojIyMjIyBCT0RZIHZzLiBIRUFSVAoKRGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiB0aGUgX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgY2xvc2VyIHRvIHplcm8gYW1vbmcgYm90aCBvbGRlciBhbmQgeW91bmdlciBjaGlsZHJlbiwgYXMgY29tcGFyZWQgdG8gYWR1bHRzIChzZWUgdGhlICJPbGRlciB2cy4gYWR1bHRzIiBhbmQgIllvdW5nZXIgY2hpbGRyZW4gdnMuIGFkdWx0cyIgcm93cyBmb3IgdGhlICJCT0RZLUhFQVJUIiBjb21wYXJpc29uIGluIFRhYmxlIDQueCkuIEEgaGFuZGZ1bCBvZiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycyBkaWZmZXJlZCBzdWJzdGFudGlhbGx5IGFjcm9zcyBhZ2UgZ3JvdXBzIChzZWUgdGhlICJJbnRlcmFjdGlvbiIgcm93IGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KTsgdGhpcyBpcyBvdXRzaWRlIG9mIHRoZSBzY29wZSBvZiB0aGUgY3VycmVudCBjaGFwdGVyLiAgCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpEaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIHRoZSBfQk9EWV8gYW5kIF9NSU5EXyBzY2FsZXMgd2VyZSBub3QgZGlmZmVyZW50aWFibGUgZnJvbSBhZHVsdHMgYW1vbmcgb2xkZXIgY2hpbGRyZW4gaW4gdGhpcyBhbmFseXNpcywgYnV0IHJldmVyc2VkIGluIHNpZ24gYW1vbmcgeW91bmdlciBjaGlsZHJlbiAoc2VlIHRoZSAiT2xkZXIgdnMuIGFkdWx0cyIgYW5kICJZb3VuZ2VyIGNoaWxkcmVuIHZzLiBhZHVsdHMiIHJvd3MgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQueCkuIEFnYWluLCBoYW5kZnVsIG9mIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzIGRpZmZlcmVkIHN1YnN0YW50aWFsbHkgYWNyb3NzIGFnZSBncm91cHMgKHNlZSB0aGUgIkludGVyYWN0aW9uIiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQueCk7IHRoaXMgaXMgb3V0c2lkZSBvZiB0aGUgc2NvcGUgb2YgdGhlIGN1cnJlbnQgY2hhcHRlci4gICAgCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKRGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiB0aGUgX0hFQVJUXyBhbmQgX01JTkRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgY2xvc2VyIHRvIHplcm8gYW1vbmcgYm90aCBvbGRlciBjaGlsZHJlbiBhbmQgeW91bmdlciBjaGlsZHJlbiwgYXMgY29tcGFyZWQgdG8gYWR1bHRzIChzZWUgdGhlICJPbGRlciBjaGlsZHJlbiB2cy4gYWR1bHRzIiBhbmQgIllvdW5nZXIgY2hpbGRyZW4gdnMuIGFkdWx0cyIgcm93cyBmb3IgdGhlICJIRUFSVC1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQueCksIEFnYWluLCBoYW5kZnVsIG9mIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzIGRpZmZlcmVkIHN1YnN0YW50aWFsbHkgYWNyb3NzIGFnZSBncm91cHMgKHNlZSB0aGUgIkludGVyYWN0aW9uIiByb3cgZm9yIHRoZSAiSEVBUlQtTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpOyB0aGlzIGlzIG91dHNpZGUgb2YgdGhlIHNjb3BlIG9mIHRoZSBjdXJyZW50IGNoYXB0ZXIuICAKCiMjIyMjIEludGVyaW0gZGlzY3Vzc2lvbgoKVGhlc2UgZm9ybWFsIGNvbXBhcmlzb25zIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGFtb25nIHlvdW5nZXIgY2hpbGRyZW4gKDQtNnkpLCBvbGRlciBjaGlsZHJlbiAoNy05eSksIGFuZCBhZHVsdHMgaW4gU3R1ZHkgMyBjb25maXJtIG15IGVhcmxpZXIgb2JzZXJ2YXRpb25zIHRoYXQgYXN5bW1ldHJpZXMgd2VyZSBzdWJzdGFudGlhbGx5IGF0dGVudWF0ZWQgYW1vbmcgYm90aCBvbGRlciBhbmQgZXNwZWNpYWxseSB5b3VuZ2VyIGNoaWxkcmVuLCByZWxhdGl2ZSB0byB0aGUgYmFzZWxpbmUgc2V0IGJ5IGFkdWx0cy4gVGhlIG9ubHkgZXhjZXB0aW9ucyB0byB0aGlzIHJ1bGUgd2VyZSAoMSkgVGhlIEJPRFkgdnMuIE1JTkQgZGlmZmVyZW5jZSBzY29yZXMgYW1vbmcgb2xkZXIgY2hpbGRyZW4gd2FzIG5vdCBkaWZmZXJlbnRpYWJsZSBmcm9tIHRob3NlIG9mIGFkdWx0cyAobGlrZWx5IGJlY2F1c2UgdGhpcyB3YXMgdGhlIHdlYWtlc3Qgb2YgdGhlIGFzeW1tZXRyaWVzIGFtb25nIGFkdWx0cyk7IGFuZCAoMikgVGhlIEJPRFkgdnMuIE1JTkQgZGlmZmVyZW5jZSBzY29yZXMgYW1vbmcgeW91bmdlciBjaGlsZHJlbiByYW4gaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiB0byB0aG9zZSBvZiBhZHVsdHMgKGFzIGRpc2N1c3NlZCBpbiBteSBlYXJsaWVyIGRlc2NyaXB0aW9uIG9mIHlvdW5nZXIgY2hpbGRyZW4ncyByZXNwb25zZXMpLgoKIyMgRGlzY3Vzc2lvbgoKWFggX19JTlNFUlQgU1RVRFkgMyBESVNDVVNTSU9OX18KCmBgYHtyfQpzY2FsZXNfc3R1ZHkzIDwtIGJpbmRfcm93cyhzY2FsZXNfZWZhX3dkbV9kM19hZCAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHN0dWR5ID0gIlN0dWR5IDM6IEFkdWx0cyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXNfZWZhX3dkbV9kM183OSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHN0dWR5ID0gIlN0dWR5IDM6IENoaWxkcmVuLCA3LTl5IikpICU+JQogIHNlbGVjdCgtYyhsb2FkaW5nLCBvcmRlcikpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgc3ByZWFkKHN0dWR5LCBmYWN0b3IpICU+JQogIG11dGF0ZSh1cl9mYWN0b3IgPSBgU3R1ZHkgMzogQWR1bHRzYCkgJT4lCiAgbGVmdF9qb2luKHNjYWxlc19lZmFfd2RtX2QzX2FkICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoY2FwYWNpdHksIG9yZGVyKSAlPiUgcmVuYW1lKG9yZGVyX2FkID0gb3JkZXIpKSAlPiUKICBsZWZ0X2pvaW4oc2NhbGVzX2VmYV93ZG1fZDNfNzkgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgb3JkZXIpICU+JSByZW5hbWUob3JkZXJfNzkgPSBvcmRlcikpICU+JQogIGFycmFuZ2UodXJfZmFjdG9yLCBvcmRlcl9hZCwgb3JkZXJfNzkpICU+JQogIHNlbGVjdCgtdXJfZmFjdG9yKSAjJT4lCiMgc2VsZWN0KC1zdGFydHNfd2l0aCgib3JkZXIiKSkKYGBgCgpgYGB7cn0KcGxvdHNfYWdlZ3BfZDNfc2NvcmVkX2FkIDwtIHJlbHZpel9hZ2VncF9mdW4oCiAgZF9zY29yZWQgPSBkM19hZF9zY29yZWRfYWQgJT4lIAogICAgZnVsbF9qb2luKGQzXzc5X3Njb3JlZF9hZCkgJT4lIAogICAgZnVsbF9qb2luKGQzXzQ2X3Njb3JlZF9hZCksIAogIGFnZV9ncm91cHMgPSBjKCJjaGlsZHJlbjQ2IiwgImNoaWxkcmVuNzkiLCAiYWR1bHRzIiksCiAgYWdlX2dyb3VwX2xhYmVscyA9IGMoIkNoaWxkcmVuLCAoNC02eSkiLCAiQ2hpbGRyZW4gKDctOXkpIiwgIkFkdWx0cyIpLAogIGNvbG9ycyA9IGNvbG9yczA5KQpgYGAKCmBgYHtyfQpmaWdfZDNfYWxsX3Njb3JlZF9hZF9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfYWdlZ3BfZDNfc2NvcmVkX2FkW1sxXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2FnZWdwX2QzX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19hZ2VncF9kM19zY29yZWRfYWRbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRDEiLCAiRDIiLCAiRDMiKSwgbmNvbCA9IDMpCgpmaWdfZDNfYWxsX3Njb3JlZF9hZF9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19hZ2VncF9kM19zY29yZWRfYWRbWzFdXSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDksCiAgICAgICAgICAgICAgICAgICAgICAgbmEudHJhbnNsYXRlID0gRiwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDkpKSkKCmZpZ19kM19hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZyA8LSBwbG90X2dyaWQoCiAgZmlnX2QzX2FsbF9zY29yZWRfYWRfcGxvdHMsIGZpZ19kM19hbGxfc2NvcmVkX2FkX2xlZywKICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlnX2QzX2FsbF9zY29yZWRfYWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJUcmFja2luZyBkZXZlbG9wbWVudCBiZXR3ZWVuIDQtOXkgYW5kIGFkdWx0aG9vZCAoc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDNfYWxsX3Njb3JlZF9hZF9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKAogIGZpZ19kM19hbGxfc2NvcmVkX2FkX3RpdGxlLCBmaWdfZDNfYWxsX3Njb3JlZF9hZF9wbG90c19sZWcsCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7cn0KZmlndXJlNC54IDwtIHBsb3RfZ3JpZChmaWdfZDNfYWRfcGxvdHNfbGVnX3RpdGxlLCAKICAgICAgICAgICAgICAgICAgICAgICBmaWdfZDNfNzlfcGxvdHNfbGVnX3RpdGxlLAogICAgICAgICAgICAgICAgICAgICAgIGZpZ19kM180Nl9wbG90c19sZWdfdGl0bGUsIAogICAgICAgICAgICAgICAgICAgICAgIGZpZ19kM19hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZ190aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSkKCmZpZ3VyZTQueF9jYXAgPC0gYWRkX3N1YihmaWd1cmU0LngsIHN0cl93cmFwKCJGaWd1cmUgNC54OiBSZWxhdGlvbnNoaXBzIGFtb25nIFVTIGFkdWx0cycsIG9sZGVyIGNoaWxkcmVuJ3MsIGFuZCB5b3VuZ2VyIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZHkgMywgc2NvcmVkIHVzaW5nIGFkdWx0cycgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIHNjYWxlcyAoc2VlIFRhYmxlIDQueCkuIChBKSBBZHVsdHMuIChCKSBPbGRlciBjaGlsZHJlbiAoNy05eSBvZiBhZ2UpLiAoQykgWW91bmdlciBjaGlsZHJlbiAoNC02eSBvZiBhZ2UpLiAoRCkgQSB2aXN1YWxpemF0aW9uIG9mIGRldmVsb3BtZW50IGJldHdlZW4gNC05eSBhbmQgYWR1bHRob29kLCB1c2luZyBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYW5kIGFnZSBncm91cC4gUGxvdHMgYXJlIG9yZ2FuaXplZCBieSBzYW1wbGUgKHJvd3MpIGFuZCBieSBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKGNvbHVtbnMpLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMS4gSW4gcGFuZWxzIEEtQywgaW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYXJlIHBsb3R0ZWQgYXMgc21hbGwsIHRyYW5zbHVjZW50IGNpcmNsZXMsIGFuZCBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZC4iLCAxMTApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDEuOH0KZ2dkcmF3KGZpZ3VyZTQueF9jYXApCmBgYAoKYGBge3J9CmZpZ3VyZTQueF9wbG90cyA8LSBwbG90X2dyaWQoCiAgcGxvdF9kM19hZF9zY29yZWRfYWRfZGlmZiArCiAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDM6IEFkdWx0cyIpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgcGxvdF9kM183OV9zY29yZWRfYWRfZGlmZiArCiAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDM6IENoaWxkcmVuLCA3LTl5IChzY29yZWQgdXNpbmcgYWR1bHRzJyBzY2FsZXMpIikgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICBwbG90X2QzXzQ2X3Njb3JlZF9hZF9kaWZmICsgCiAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDM6IENoaWxkcmVuLCA0LTZ5IChzY29yZWQgdXNpbmcgYWR1bHRzJyBzY2FsZXMpIikgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwgCiAgbmNvbCA9IDMsIHJlbF93aWR0aHMgPSBjKDEsIDEsIDEpLAogIGxhYmVscyA9ICJBVVRPIikKCmZpZ3VyZTQueF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ3VyZTQueF9wbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2xlZ2VuZChwbG90X2QzX2FkX3Njb3JlZF9hZF9kaWZmKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjEpKQoKZmlndXJlNC54X2NhcCA8LSBhZGRfc3ViKGZpZ3VyZTQueF9wbG90c19sZWcsIHN0cl93cmFwKCJGaWd1cmUgNC54OiBEaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIFVTIGFkdWx0cycgYW5kIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZHkgMy4gdGhpcyBpbmNsdWRlcyBkaWZmZXJlbmNlIHNjb3JlcyB1c2luZyBhZHVsdHMnIEJPRFksIEhFQVJULCBhbmQgTUlORCBzY2FsZXMgKHBhbmVsIEIpIGFuZCBkaWZmZXJlbmNlIHNjb3JlcyB1c2luZyBjaGlsZHJlbidzIG93biBzY2FsZXMgKHBhbmVsIEM7IHNlZSBUYWJsZSA0LngpLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMSwgc3VjaCB0aGF0IGRpZmZlcmVuY2Ugc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gLTEgdG8gKzEuIEluZGl2aWR1YWwgcGFydGljaXBhbnRzIGFyZSBwbG90dGVkIGFzIHNtYWxsLCB0cmFuc2x1Y2VudCBjaXJjbGVzLCBhbmQgbWVhbiBkaWZmZXJlbmNlIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZCAoaS5lLiwgYSBkaWZmZXJlbmNlIHNjb3JlIG9mIDApLiIsIDE4MCksIHggPSAwLCBoanVzdCA9IDApCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMC4zOH0KZ2dkcmF3KGZpZ3VyZTQueF9jYXApCmBgYAoKYGBge3J9CnJlZ3RhYl9zdHVkeTMgPC0gcmVndGFiX2QzX2FkX3Njb3JlZF9hZF9kaWZmICU+JQogIGZ1bGxfam9pbihyZWd0YWJfZDNfNzlfc2NvcmVkX2FkX2RpZmYpICU+JQogIGZ1bGxfam9pbihyZWd0YWJfZDNfNDZfc2NvcmVkX2FkX2RpZmYpICU+JQogIG11dGF0ZV9hdCh2YXJzKGIsIHMuZS4pLAogICAgICAgICAgICBmdW5zKGZvcm1hdChyb3VuZCguLCBkaWdpdHMgPSAyKSwgbnNtYWxsID0gMikpKSAlPiUKICB1bml0ZShyZXN1bHQsIGIsIHMuZS4sIENJOTUsIG5vbnplcm8pICU+JQogIHNwcmVhZChzdHVkeSwgcmVzdWx0KSAlPiUKICBzZXBhcmF0ZShgQWR1bHRzYCwgYygiczJhX2IiLCAiczJhX3MuZS4iLCAiczJhXzk1JSBDSSIsICJzMmFfbnoiKSwgc2VwID0gIl8iKSAlPiUKICBzZXBhcmF0ZShgQ2hpbGRyZW4sIDctOXkgKHVzaW5nIGFkdWx0cycgc2NhbGVzKWAsIGMoInMyYl9iIiwgInMyYl9zLmUuIiwgInMyYl85NSUgQ0kiLCAiczJiX256IiksIHNlcCA9ICJfIikgJT4lCiAgc2VwYXJhdGUoYENoaWxkcmVuLCA0LTZ5ICh1c2luZyBhZHVsdHMnIHNjYWxlcylgLCBjKCJzMmNfYiIsICJzMmNfcy5lLiIsICJzMmNfOTUlIENJIiwgInMyY19ueiIpLCBzZXAgPSAiXyIpCmBgYAoKYGBge3J9CnRhYmxlNC54IDwtIHJlZ3RhYl9zdHVkeTMgJT4lCiAgc2VsZWN0KC1wYWlyLCAtY29udGFpbnMoInMuZS4iKSkgJT4lCiAgcmVuYW1lKFBhcmFtZXRlciA9IHBhcmFtKSAlPiUKICByZW5hbWVfYWxsKGZ1bnMoZ3N1YigibnoiLCAiICIsIC4pKSkgJT4lCiAgcmVuYW1lX2FsbChmdW5zKGdzdWIoInMyLl8iLCAiIiwgLikpKSAlPiUKICBrYWJsZShmb3JtYXQgPSAiaHRtbCIsIGFsaWduID0gYygibCIsIHJlcChjKHJlcCgiciIsIDIpLCAibCIpLCAzKSksIAogICAgICAgIGNhcHRpb24gPSAiVGFibGUgNC54OiBSZWdyZXNzaW9uIGFuYWx5c2VzIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGFtb25nIFVTIGFkdWx0cywgb2xkZXIgY2hpbGRyZW4gKDctOXkgb2YgYWdlKSwgYW5kIHlvdW5nZXIgY2hpbGRyZW4gKDQtNnkgb2YgYWdlKSBpbiBTdHVkeSAzLiBUaGUgdGFibGUgcHJlc2VudHMgcmVzdWx0cyBmcm9tIHNlcGFyYXRlIEJheWVzaWFuIHJlZ3Jlc3Npb25zIG9mIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChCT0RZIHZzLiBIRUFSVCwgQk9EWSB2cy4gTUlORCwgYW5kIEhFQVJUIHZzLiBNSU5EKS4gRWFjaCByZWdyZXNzaW9uIGluY2x1ZGVkIHR3byBmaXhlZCBlZmZlY3QgcGFyYW1ldGVyczogKDEpIHRoZSBpbnRlcmNlcHQsIHdoaWNoIEkgdHJlYXQgYXMgYW4gaW5kZXggb2YgdGhlIGFzeW1tZXRyeSBpbiBhdHRyaWJ1dGlvbnMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIGluIHF1ZXN0aW9uOyBhbmQgKDIpIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzLCByZXBvcnRlZCBoZXJlIGFzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByb2JvdCBhbmQgdGhlIGdyYW5kIG1lYW4gKEdNKS4gVGhlIGludGVyY2VwdHMgYXJlIGhpZ2hsaWdodGVkIGluIGJvbGQsIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBwcmltYXJ5IHBhcmFtZXRlcnMgb2YgaW50ZXJlc3QgZm9yIHRoZXNlIGFuYWx5c2VzLiBGb3IgZWFjaCBwYXJhbWV0ZXIsIHRoZSB0YWJsZSBpbmNsdWRlcyB0aGUgZXN0aW1hdGUgKGIpIGFuZCBhIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBmb3IgdGhhdCBlc3RpbWF0ZS4gQXN0ZXJpc2tzIGluZGljYXRlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbHMgdGhhdCBkbyBub3QgaW5jbHVkZSAwLiIpICU+JSAgCiAga2FibGVfc3R5bGluZygpICU+JQogIHJvd19zcGVjKGMoMSwgMTAsIDE5KSwgYm9sZCA9IFQpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBIRUFSVCIsIDEsIDkpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBNSU5EIiwgMTAsIDE4KSAlPiUKICBncm91cF9yb3dzKCJIRUFSVCAtIE1JTkQiLCAxOSwgMjcpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLAogICAgICAgICAgICAgICAgICAgICAiQWR1bHRzIiA9IDMsCiAgICAgICAgICAgICAgICAgICAgICJDaGlsZHJlbiwgNy05eSAodXNpbmcgYWR1bHRzJyBzY2FsZXMpIiA9IDMsCiAgICAgICAgICAgICAgICAgICAgICJDaGlsZHJlbiwgNC02eSAodXNpbmcgYWR1bHRzJyBzY2FsZXMpIiA9IDMpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0KdGFibGU0LngKYGBgCgpgYGB7cn0KdGFibGU0LnggPC0gcmVndGFiX2QzX2FkNzk0Nl9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXBhaXIsIC1zdHVkeSwgLWNvbnRhaW5zKCJzLmUuIikpICU+JQogIG11dGF0ZShiID0gZm9ybWF0KHJvdW5kKGIsIDIpLCBuc21hbGwgPSAyKSkgJT4lCiAgcmVuYW1lKFBhcmFtZXRlciA9IHBhcmFtLAogICAgICAgICBgOTUlIENJYCA9IENJOTUpICU+JQogIHJlbmFtZV9hbGwoZnVucyhnc3ViKCJub256ZXJvIiwgIiAiLCAuKSkpICU+JQogIGthYmxlKGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSBjKCJsIiwgcmVwKGMocmVwKCJyIiwgMiksICJsIiksIDMpKSwgCiAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSA0Lng6IFJlZ3Jlc3Npb24gYW5hbHlzZXMgb2YgZGlmZmVyZW5jZXMgaW4gZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBVUyBhZHVsdHMgYW5kIGJvdGggb2xkZXIgY2hpbGRyZW4gKDctOXkgb2YgYWdlKSBhbmQgeW91bmdlciBjaGlsZHJlbiAoNC02eSBvZiBhZ2UpIGluIFN0dWR5IDMuIFRoZSB0YWJsZSBwcmVzZW50cyByZXN1bHRzIGZyb20gc2VwYXJhdGUgQmF5ZXNpYW4gcmVncmVzc2lvbnMgb2YgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKEJPRFkgdnMuIEhFQVJULCBCT0RZIHZzLiBNSU5ELCBhbmQgSEVBUlQgdnMuIE1JTkQpLiBFYWNoIHJlZ3Jlc3Npb24gaW5jbHVkZWQgZm91ciBmaXhlZCBlZmZlY3QgcGFyYW1ldGVyczogKDEpIHRoZSBpbnRlcmNlcHQgKGZvciBhZHVsdHMpLCB3aGljaCBJIHRyZWF0IGFzIGFuIGluZGV4IG9mIHRoZSBhc3ltbWV0cnkgaW4gYXR0cmlidXRpb25zIG9mIHRoZSB0d28gY29uY2VwdHVhbCB1bml0cyBpbiBxdWVzdGlvbiBhbW9uZyBhZHVsdHM7ICgyKSBhIGRpZmZlcmVuY2UgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycyAoYW1vbmcgYWR1bHRzKSwgcmVwb3J0ZWQgaGVyZSBhcyBhIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcm9ib3QgYW5kIHRoZSBncmFuZCBtZWFuIChHTSk7ICgzKSB0aGUgb3ZlcmFsbCBkaWZmZXJlbmNlIGJldHdlZW4gY2hpbGRyZW4gYW5kIGFkdWx0cyAoY29sbGFwc2luZyBhY3Jvc3MgdGFyZ2V0IGNoYXJhY3RlcnMpOyBhbmQgKDQpIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoaXMgYWdlIGRpZmZlcmVuY2UgYW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMuIFRoZSBkZXZlbG9wbWVudGFsIGNvbXBhcmlzb25zIG9mIHRoZSBpbnRlcmNlcHRzIGFyZSBoaWdobGlnaHRlZCBpbiBib2xkLCBiZWNhdXNlIHRoZXNlIGFyZSB0aGUgcHJpbWFyeSBwYXJhbWV0ZXJzIG9mIGludGVyZXN0IGZvciB0aGVzZSBhbmFseXNlcy4gRm9yIGVhY2ggcGFyYW1ldGVyLCB0aGUgdGFibGUgaW5jbHVkZXMgdGhlIGVzdGltYXRlIChiKSBhbmQgYSA5NSUgY3JlZGlibGUgaW50ZXJ2YWwgZm9yIHRoYXQgZXN0aW1hdGUuIEFzdGVyaXNrcyBpbmRpY2F0ZSA5NSUgY3JlZGlibGUgaW50ZXJ2YWxzIHRoYXQgZG8gbm90IGluY2x1ZGUgMC4iKSAlPiUgIAogIGthYmxlX3N0eWxpbmcoKSAlPiUKICByb3dfc3BlYyhjKDEsIDI4LCA1NSksIGJvbGQgPSBUKSAlPiUKICBncm91cF9yb3dzKCJCT0RZIC0gSEVBUlQiLCAxLCAyNykgJT4lCiAgZ3JvdXBfcm93cygiQk9EWSAtIE1JTkQiLCAyOCwgNTQpICU+JQogIGdyb3VwX3Jvd3MoIkhFQVJUIC0gTUlORCIsIDU1LCA4MSkgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICJEZXZlbG9wbWVudGFsIGNvbXBhcmlzb24iID0gMykpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQp0YWJsZTQueApgYGAKCgojIFN0dWR5IDQ6IEEgZm9jdXMgb24gZWFybHkgY2hpbGRob29kICg0LTV5KQoKWFggX19JTlNFUlQgU1RVRFkgSU5UUk9EVUNUSU9OX18KCkluIFN0dWR5IDQsIGByIG5yb3coZDRfYWRfd2lkZSkvMmAgVVMgYWR1bHRzIGFuZCBgciBucm93KGQ0XzQ2X3dpZGUpLzJgIFVTIGNoaWxkcmVuIGJldHdlZW4gdGhlIGFnZXMgb2YgYHIgc3VtbWFyeShkNF80NiRhZ2UpWyJNaW4uIl0gJT4lIHJvdW5kKDIpYC1gciBzdW1tYXJ5KGQ0XzQ2JGFnZSlbIk1heC4iXSAlPiUgcm91bmQoMilgIHllYXJzIChtZWRpYW46IGByIHN1bW1hcnkoZDRfNDYkYWdlKVsiTWVkaWFuIl0gJT4lIHJvdW5kKDIpYHkpIGVhY2ggYXNzZXNzZWQgdHdvIHRhcmdldCBjaGFyYWN0ZXJzIG9uIDE4IG1lbnRhbCBjYXBhY2l0aWVzLiBUbyBtYWtlIHRoZSBzdHVkeSBhcHByb3ByaWF0ZSBmb3IgY2hpbGRyZW4gaW4gdGhpcyBhZ2UgcmFuZ2UsIHRoaXMgc3R1ZHkgZW1wbG95ZWQgYSBuZXcgc2V0IG9mIDE4IG1lbnRhbCBjYXBhY2l0aWVzIChzb21lIGJ1dCBub3QgYWxsIG9mIHdoaWNoIHdlcmUgdXNlZCBpbiBTdHVkaWVzIDEtMykuIEluIGFkZGl0aW9uLCBwYXJ0aWNpcGFudHMgd2VyZSBwcmVzZW50ZWQgd2l0aCBhIG1vcmUgY2hpbGQtZnJpZW5kbHkgdmlzdWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSAzLXBvaW50IHJlc3BvbnNlIHNjYWxlICgibm8sIiBjb2RlZCBhcyAwOyAia2luZGEsIiBjb2RlZCBhcyAwLjUsICJ5ZXMsIiBjb2RlZCBhcyAxKS4gVGhpcyBzdHVkeSBlbXBsb3llZCB0aGUgImVkZ2UgY2FzZSIgdmFyaWFudCBvZiB0aGUgZ2VuZXJhbCBhcHByb2FjaCwgd2l0aCBwYXJ0aWNpcGFudHMgYXNzZXNzaW5nIGJvdGggYSBiZWV0bGUgb3IgYSByb2JvdCBpbiBzZXF1ZW5jZSAod2l0aCBvcmRlciBjb3VudGVyYmFsYW5jZWQgYWNyb3NzIHBhcnRpY2lwYW50cykuIChTZWUgQ2hhcHRlciBJSSBmb3IgZGV0YWlsZWQgbWV0aG9kcy4pCgojIyBTcGVjaWFsIG5vdGVzIG9uIGRhdGEgcHJvY2Vzc2luZyBhbmQgYW5hbHlzaXMKCiMjIFJlc3VsdHMKCiMjIyBBZHVsdHMKCiMjIyMgU2NhbGUgY29uc3RydWN0aW9uCgpgYGB7cn0Kc2NhbGVzX2VmYV93ZG1fZDRfYWQgPC0gc2NhbGVfZnVuKGVmYV93ZG1fZDRfYWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yX25hbWVzID0gZmFjdG9yX25hbWVzX2VmYV93ZG1fZDRfYWQpCmQ0X2FkX3Njb3JlZF9hZCA8LSBzY29yZV9mdW4oZDRfYWQsIHNjYWxlc19lZmFfd2RtX2Q0X2FkKQoKc2F2ZVJEUyhzY2FsZXNfZWZhX3dkbV9kNF9hZCwgZmlsZSA9ICIuL3N0b3JlZC9zY2FsZXMvc2NhbGVzX2VmYV93ZG1fZDRfYWQiKQpzYXZlUkRTKGQ0X2FkX3Njb3JlZF9hZCwgZmlsZSA9ICIuL3N0b3JlZC9zY29yZWRfZGF0YS9kNF9hZF9zY29yZWRfYWQiKQpgYGAKCkZvbGxvd2luZyB0aGUgc3RlcHMgZGVzY3JpYmVkIGluICJHZW5lcmFsIGFuYWx5c2lzIHBsYW4sIiBhYm92ZSwgeWllbGRlZCBgciBmYWN0X25hbWVfZnVuKGZhY3Rvcl9uYW1lc19lZmFfd2RtX2Q0X2FkKWAgc2NhbGVzIG9mIGByIHNjYWxlc19lZmFfd2RtX2Q0X2FkICU+JSBjb3VudChmYWN0b3IpICU+JSBzdW1tYXJpc2UobWVhbiA9IG1lYW4obikpICU+JSBzZWxlY3QobWVhbikgJT4lIGFzLm51bWVyaWMoKWAgaXRlbXMgZWFjaDsgc2VlIFRhYmxlIDQueC4KCiMjIyMgVmlzdWFsaXphdGlvbgoKYGBge3J9CnBsb3RzX2Q0X2FkX3Njb3JlZF9hZCA8LSByZWx2aXpfZnVuKGQ0X2FkX3Njb3JlZF9hZCkKYGBgCgpgYGB7cn0KZmlnX2Q0X2FkX3Bsb3RzIDwtIHBsb3RfZ3JpZChwbG90c19kNF9hZF9zY29yZWRfYWRbWzFdXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2Q0X2FkX3Njb3JlZF9hZFtbMl1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzX2Q0X2FkX3Njb3JlZF9hZFtbM11dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkExIiwgIkEyIiwgIkEzIiksIG5jb2wgPSAzKQoKZmlnX2Q0X2FkX2xlZyA8LSBnZXRfbGVnZW5kKAogIHBsb3RzX2Q0X2FkX3Njb3JlZF9hZFtbMV1dICsgCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHRpdGxlLnBvc2l0aW9uID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDIpKSkKCmZpZ19kNF9hZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kNF9hZF9wbG90cywgZmlnX2Q0X2FkX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kNF9hZF90aXRsZSA8LSBnZ2RyYXcoKSArIAogIGRyYXdfbGFiZWwoIlN0dWR5IDQ6IEFkdWx0cyIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDRfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDRfYWRfdGl0bGUsIGZpZ19kNF9hZF9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKZmlnX2Q0X2FkX3Bsb3RzX2xlZ190aXRsZQpgYGAKClZpc3VhbGl6YXRpb25zIG9mIHJlbGF0aW9uc2hpcHMgYW1vbmcgc2NvcmVzIG9uIHRoZXNlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYXJlIHByb3ZpZGVkIGluIEZpZ3VyZSA0LngsIHJvdyBBLgoKVGhlc2UgdmlzdWFsaXphdGlvbnMgYXJlIGFsbCBleHRyZW1lbHkgc2ltaWxhciB0byB0aG9zZSBkaXNjdXNzZWQgYXQgbGVuZ3RoIGluIFN0dWRpZXMgMWEtMWMgYW5kIFN0dWR5IDI7IEkgd2lsbCBub3QgZGVzY3JpYmUgdGhlbSBmdXJ0aGVyIGhlcmUuCgojIyMjIEFuYWx5c2lzIG9mIGFzeW1tZXRyaWVzCgpIZXJlIEkgcHJvdmlkZSBhIGZvcm1hbCBhbmFseXNpcyBvZiB0aGVzZSBhc3ltbWV0cmllcy4gQXMgaW4gcHJldmlvdXMgc3R1ZGllcywgZm9yIGVhY2ggcGFpciBvZiBjb25jZXB0dWFsIHVuaXRzIChCT0RZIHZzLiBIRUFSVCwgQk9EWSB2cy4gTUlORCwgYW5kIEhFQVJUIHZzLiBNSU5EKSwgSSB1c2VkIEJheWVzaWFuIHJlZ3Jlc3Npb24gdG8gY29tcGFyZSBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIHRoZXNlIHR3byBjb25jZXB0dWFsIHVuaXRzIHRvIHplcm8sIGNvbnRyb2xsaW5nIGZvciBkaWZmZXJlbmNlcyBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgdHdvICJlZGdlIGNhc2VzIiB0aGF0IHdlcmUgZmVhdHVyZWQgYXMgdGFyZ2V0IGNoYXJhY3RlcnMgaW4gdGhlc2Ugc3R1ZGllcy4gQXMgaW4gU3R1ZHkgMWQsIEkgYWNjb3VudCBmb3IgdGhlIHdpdGhpbi1zdWJqZWN0cyBkZXNpZ24gYnkgaW5jbHVkZWQgbWF4aW1hbCByYW5kb20gZWZmZWN0cyBzdHJ1Y3R1cmUgKGluIHRoaXMgY2FzZSwgcmFuZG9tIGludGVyY2VwdHMgZm9yIHBhcnRpY2lwYW50cykuIFNlZSBGaWd1cmUgNC54LCBwYW5lbCBELCBmb3IgdmlzdWFsIGRlcGljdGlvbnMgb2YgdGhlc2UgZGlmZmVyZW5jZSBzY29yZXMuCgpgYGB7cn0KZDRfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZl9mdW4oZDRfYWRfc2NvcmVkX2FkKQpjb250cmFzdHMoZDRfYWRfc2NvcmVkX2FkX2RpZmYkY2hhcmFjdGVyKSA8LSBjb250cmFzdHNfc3VtX2VkZ2UKCnNhdmVSRFMoZDRfYWRfc2NvcmVkX2FkX2RpZmYsICIuL3N0b3JlZC9kaWZmc2NvcmVfZGF0YS9kNF9hZF9zY29yZWRfYWRfZGlmZiIpCmBgYAoKYGBge3J9CnBsb3RfZDRfYWRfc2NvcmVkX2FkX2RpZmYgPC0gZGlmZnBsb3RfZnVuKGQ0X2FkX3Njb3JlZF9hZF9kaWZmKQpgYGAKCmBgYHtyfQojIHJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0X2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIEhFQVJUIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKc3VtbWFyeShyX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kNF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkNF9hZF9zY29yZWRfYWRfZGlmZiAlPiUgZmlsdGVyKHBhaXIgPT0gIkJPRFkgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpyX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpzdW1tYXJ5KHJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EKQpgYGAKCmBgYHtyfQojIHJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0X2FkX3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQsCiMgICAgICAgICAiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF9hZF9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIikKCnJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKc3VtbWFyeShyX2Q0X2FkX3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQpCmBgYAoKYGBge3J9CnJlZ3RhYl9kNF9hZF9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX3JlZ190YWJsZV9mdW4oCiAgcmVnX2xpc3QgPSBsaXN0KHJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKICAgICAgICAgICAgICAgICAgcl9kNF9hZF9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQsCiAgICAgICAgICAgICAgICAgIHJfZDRfYWRfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCksCiAgcGFpcl9saXN0ID0gYygiQk9EWSAtIEhFQVJUIiwgIkJPRFkgLSBNSU5EIiwgIkhFQVJUIC0gTUlORCIpLAogIHN0dWR5X25hbWUgPSAiQWR1bHRzIiwKICBjaGFyX2xhYmVsID0gIlJvYm90IHZzLiBHTSIpCmBgYAoKYGBge3J9CiMgaW50ZXJpbSB0YWJsZSBmb3IgZWFzZSBvZiB3cml0aW5nCnJlZ3RhYl9kNF9hZF9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXN0dWR5LCAtcy5lLikgJT4lCiAgIyBmaWx0ZXIocGFyYW0gPT0gIkludGVyY2VwdCIpICU+JQogIGthYmxlKGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCnBsb3RfZDRfYWRfc2NvcmVkX2FkX2RpZmYKYGBgCgojIyMjIyBCT0RZIHZzLiBIRUFSVAoKQXMgaW4gcHJldmlvdXMgc3R1ZGllcywgZGlmZmVyZW5jZSBzY29yZXMgY29tcGFyaW5nIGFkdWx0cycgc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9IRUFSVF8gc2NhbGVzIHdlcmUgc3Vic3RhbnRpYWxseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIF9CT0RZXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0hFQVJUXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLiBBZ2FpbiwgdGhpcyBkaWZmZXJlbmNlIHdhcyBkcml2ZW4gYnkgcGFydGljaXBhbnRzJyBhc3Nlc3NtZW50cyBvZiB0aGUgYmVldGxlOyBpbiB0aGUgYWdncmVnYXRlLCBkaWZmZXJlbmNlIHNjb3JlcyB3ZXJlIHJlZHVjZWQgdG8gMCBmb3IgdGhlIHJvYm90IChzZWUgdGhlICJUYXJnZXQgY2hhcmFjdGVyIiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLiAgCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpBcyBwcmV2aW91cyBzdHVkaWVzLCBkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgYWR1bHRzJyBzY29yZXMgb24gdGhlIF9CT0RZXyBhbmQgX01JTkRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9CT0RZXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQueCkuIEFnYWluLCB0aGlzIGRpZmZlcmVuY2Ugd2FzIGRyaXZlbiBieSBwYXJ0aWNpcGFudHMnIGFzc2Vzc21lbnRzIG9mIHRoZSByb2JvdDsgaW4gdGhlIGFnZ3JlZ2F0ZSwgZGlmZmVyZW5jZSBzY29yZXMgdGVuZGVkIHRvIGJlIF9ncmVhdGVyXywgbm90IGxlc3MsIHRoYW4gemVybyBmb3IgdGhlIGJlZXRsZSAoc2VlIHRoZSAiVGFyZ2V0IGNoYXJhY3RlciIgcm93IGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLgoKIyMjIyMgSEVBUlQgdnMuIE1JTkQKCkFzIGluIHByZXZpb3VzIHN0dWRpZXMsIGRpZmZlcmVuY2Ugc2NvcmVzIGNvbXBhcmluZyBhZHVsdHMnIHNjb3JlcyBvbiB0aGUgX0hFQVJUXyBhbmQgX01JTkRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgbm9uLXplcm8sIGluIHRoZSBkaXJlY3Rpb24gb2YgcGFydGljaXBhbnRzIGVuZG9yc2luZyBfTUlORF8gaXRlbXMgbW9yZSBzdHJvbmdseSB0aGFuIF9IRUFSVF8gaXRlbXMgKHNlZSB0aGUgIkludGVyY2VwdCIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KS4gQWdhaW4sIHRoaXMgZGlmZmVyZW5jZSB3YXMgc29tZXdoYXQgZXhhZ2dlcmF0ZWQgaW4gYXNzZXNzbWVudHMgb2YgdGhlIHJvYm90LCByZWxhdGl2ZSB0byB0aGUgYmVldGxlIChzZWUgdGhlICJUYXJnZXQgY2hhcmFjdGVyIiByb3cgZm9yIHRoZSAiSEVBUlQtTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLgoKIyMjIyMgSW50ZXJpbSBkaXNjdXNzaW9uCgpUaGVzZSBmb3JtYWwgYW5hbHlzZXMgb2YgZGlmZmVyZW5jZSBzY29yZXMgYWNyb3NzIHRoZSBfQk9EWV8sIF9IRUFSVF8sIGFuZCBfTUlORF8gc2NhbGVzIGFtb25nIGFkdWx0cyBpbiBTdHVkeSA0IGNvbmZpcm0gbXkgaW5mb3JtYXRpb24gb2JzZXJ2YXRpb25zIG9mIGFzeW1tZXRyaWVzIGRlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgYW5kIGFsaWduIHF1aXRlIGNsb3NlbHkgd2l0aCBhbmFseXNlcyBvZiBhZHVsdHMgaW4gU3R1ZGllcyAxYS0xYyBhbmQgU3R1ZHkgMjogQWNyb3NzIGFsbCBvZiB0aGUgc3R1ZGllcyB0aGF0IHVzZWQgdGhlICJlZGdlIGNhc2UgYXBwcm9hY2giIHRvIGluZHVjaW5nIHZhcmlhYmlsaXR5IGluIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMsIGFkdWx0cyB0ZW5kZWQgdG8gZW5kb3JzZSBNSU5EIG1vcmUgc3Ryb25nbHkgdGhhbiBCT0RZIG9yIEhFQVJULCBhbmQgQk9EWSBtb3JlIHN0cm9uZ2x5IHRoYW4gSEVBUlQuCgojIyMgQ2hpbGRyZW4gKDQtNXkpCgpgYGB7cn0KZDRfNDZfc2NvcmVkX2FkIDwtIHNjb3JlX2Z1bihkNF80Niwgc2NhbGVzX2VmYV93ZG1fZDRfYWQpCnNhdmVSRFMoZDRfNDZfc2NvcmVkX2FkLCBmaWxlID0gIi4vc3RvcmVkL3Njb3JlZF9kYXRhL2Q0XzQ2X3Njb3JlZF9hZCIpCmBgYAoKWFggX19JTlNFUlQgU0VDVElPTiBJTlRST0RVQ1RJT04vVFJBTlNJVElPTl9fCgojIyMjIFZpc3VhbGl6YXRpb24KCmBgYHtyfQpwbG90c19kNF80Nl9zY29yZWRfYWQgPC0gcmVsdml6X2Z1bihkNF80Nl9zY29yZWRfYWQpCmBgYAoKYGBge3J9CmZpZ19kNF80Nl9wbG90cyA8LSBwbG90X2dyaWQocGxvdHNfZDRfNDZfc2NvcmVkX2FkW1sxXV0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kNF80Nl9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19kNF80Nl9zY29yZWRfYWRbWzNdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJCMSIsICJCMiIsICJCMyIpLCBuY29sID0gMykKCmZpZ19kNF80Nl9sZWcgPC0gZ2V0X2xlZ2VuZCgKICBwbG90c19kNF80Nl9zY29yZWRfYWRbWzFdXSArIAogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZS5wb3NpdGlvbiA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKCJUYXJnZXQgY2hhcmFjdGVyIiwgdmFsdWVzID0gY29sb3JzMDIsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkpCgpmaWdfZDRfNDZfcGxvdHNfbGVnIDwtIHBsb3RfZ3JpZChmaWdfZDRfNDZfcGxvdHMsIGZpZ19kNF80Nl9sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMSwgMC4wNSkpCgpmaWdfZDRfNDZfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJTdHVkeSA0OiBDaGlsZHJlbiwgNC01eSAoc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDRfNDZfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZChmaWdfZDRfNDZfdGl0bGUsIGZpZ19kNF80Nl9wbG90c19sZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CiMgaW50ZXJpbSBwbG90IGZvciBlYXNlIG9mIHdyaXRpbmcKZmlnX2Q0XzQ2X3Bsb3RzX2xlZ190aXRsZQpgYGAKClZpc3VhbGl6YXRpb25zIG9mIHJlbGF0aW9uc2hpcHMgYW1vbmcgc2NvcmVzIG9uIHRoZXNlIF9CT0RZXywgX0hFQVJUXywgYW5kIF9NSU5EXyBzY2FsZXMgYXJlIHByb3ZpZGVkIGluIEZpZ3VyZSA0LngsIHJvdyBCLgoKIyMjIyMgQk9EWSB2cy4gSEVBUlQKCkZpcnN0IEkgd2lsbCBjb25zaWRlciB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQk9EWSBhbmQgSEVBUlQgKEZpZ3VyZSA0LngsIHBhbmVsIEIxKS4gQXMgYW1vbmcgYWR1bHRzIGluIHRoaXMgc3R1ZHkgKHBhbmVsIEExKSwgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlcyBhcHBlYXJzIHRvIGJlIHNvbWV3aGF0IHBvc2l0aXZlLCBhbmQgdGhlcmUgYXBwZWFyIHRvIGJlIHNvbWV3aGF0IGZld2VyIGRhdGFwb2ludHMgYWJvdmUgdGhlIGxpbmUgb2YgZXF1aXZhbGVuY2UgKCR5ID0geCQsIGRvdHRlZCBkaWFnb25hbCBsaW5lKSB0aGFuIGJlbG93IGl04oCUYnV0IGJvdGggb2YgdGhlc2Ugb2JzZXJ2YXRpb25zIGFyZSBtdWNoIGxlc3Mgc3RyaWtpbmcgYW1vbmcgY2hpbGRyZW4gdGhhbiB0aGV5IHdlcmUgYW1vbmcgYWR1bHRzLiBJbiBvdGhlciB3b3Jkcywgd2hpbGUsIGxpa2UgdGhlIHZhc3QgbWFqb3JpdHkgb2YgYWR1bHRzLCBtYW55IGNoaWxkcmVuIGF0dHJpYnV0ZWQgbW9yZSBCT0RZIHRoYW4gSEVBUlQgdG8gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24gKHBhcnRpY3VsYXJseSB0byB0aGUgYmVldGxlLCBpbiByZWQpLCBxdWl0ZSBhIGZldyBjaGlsZHJlbiBhdHRyaWJ1dGVkIG1vcmUgSEVBUlQgdGhhbiBCT0RZIChwYXJ0aWN1bGFybHkgdG8gdGhlIHJvYm90LCBpbiBibHVlKS4gCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpOZXh0IEkgd2lsbCBjb25zaWRlciB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQk9EWSBhbmQgTUlORCAoRmlndXJlIDQueCwgcGFuZWwgQjIpLiBBcyBhbW9uZyBhZHVsdHMgaW4gdGhpcyBzdHVkeSAocGFuZWwgQTIpLCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9NSU5EXyBzY2FsZXMgYXBwZWFycyB0byBiZSBzb21ld2hhdCBwb3NpdGl2ZSwgdGhlcmUgaXMgbm8gb2J2aW91cyBldmlkZW5jZSBvZiBhbnkgYXN5bW1ldHJ5IGluIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIHRoZXNlIHR3byBjb25jZXB0dWFsIHVuaXRzLiBJbiBvdGhlciB3b3Jkcywgd2hpbGUsIGxpa2UgdGhlIG1ham9yaXR5IG9mIGFkdWx0cywgc29tZSBjaGlsZHJlbiBhdHRyaWJ1dGVkIG1vcmUgTUlORCB0aGFuIEJPRFkgdG8gdGhlIHRhcmdldCBjaGFyYWN0ZXIgaW4gcXVlc3Rpb24gKHBhcnRpY3VsYXJseSB0byB0aGUgcm9ib3QsIGluIGJsdWUpLCBvdGhlciBjaGlsZHJlbiBhdHRyaWJ1dGVkIG1vcmUgQk9EWSB0aGFuIE1JTkQgKHBhcnRpY3VsYXJseSB0byB0aGUgYmVldGxlLCBpbiByZWQpLiBUaGlzIGlzIHJlbWluaXNlbnQgb2YgbXkgZWFybGllciBvYnNlcnZhdGlvbiBhbW9uZyBvbGRlciBjaGlsZHJlbiAoNy05eSkgaW4gU3R1ZHkgMiwgd2hlcmUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIF9CT0RZXyBhbmQgX01JTkRfIHNjb3JlcyB3ZW50IGluIG9wcG9zaXRlIGRpcmVjdGlvbnMgZm9yIHRoZXNlIHR3byAiZWRnZSBjYXNlcy4iCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKRmluYWxseSBJIHdpbGwgY29uc2lkZXIgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEhFQVJUIGFuZCBNSU5EIChGaWd1cmUgNC54LCBwYW5lbCBCMykuIEFzIGFtb25nIGFkdWx0cyBpbiB0aGlzIHN0dWR5IChwYW5lbCBBMyksIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzY29yZXMgb24gdGhlIF9IRUFSVF8gYW5kIF9NSU5EXyBzY2FsZXMgYXBwZWFycyB0byBiZSBwb3NpdGl2ZSwgYW5kIHRoZXJlIGFwcGVhciB0byBiZSBzb21ld2hhdCBmZXdlciBkYXRhcG9pbnRzIGJlbG93IHRoZSBsaW5lIG9mIGVxdWl2YWxlbmNlICgkeSA9IHgkLCBkb3R0ZWQgZGlhZ29uYWwgbGluZSkgdGhhbiBhYm92ZSBpdOKAlGJ1dCwgYXMgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb25zLCBib3RoIG9mIHRoZXNlIG9ic2VydmF0aW9ucyBhcmUgbXVjaCBsZXNzIHN0cmlraW5nIGFtb25nIGNoaWxkcmVuIHRoYW4gdGhleSB3ZXJlIGFtb25nIGFkdWx0cy4gSW4gb3RoZXIgd29yZHMsIHdoaWxlIG1hbnkgY2hpbGRyZW4gYXR0cmlidXRlZCBtb3JlIE1JTkQgdGhhbiBIRUFSVCB0byB0aGUgdGFyZ2V0IGNoYXJhY3RlciBpbiBxdWVzdGlvbiAobGlrZSB0aGUgdmFzdCBtYWpvcml0eSBvZiBhZHVsdHMpLCBxdWl0ZSBhIGZldyBjaGlsZHJlbiBhdHRyaWJ1dGVkIG1vcmUgSEVBUlQgdGhhbiBNSU5ELiBUaGlzIGFwcGVhcnMgdG8gaGF2ZSBiZWVuIHRydWUgZm9yIGJvdGggdGFyZ2V0IGNoYXJhY3RlcnMuCgojIyMjIyBJbnRlcmltIGRpc2N1c3Npb24KClVzaW5nIGEgcGFydGljdWxhcmx5IGNoaWxkLWZyaWVuZGx5IHBhcmFkaWdtLCB0aGUgcmVsYXRpb25zaGlwcyB5b3VuZyBjaGlsZHJlbidzIGVuZG9yc2VtZW50cyBvZiBCT0RZLCBIRUFSVCwgYW5kIE1JTkQgKGFzIGRlZmluZWQgYnkgYWR1bHRzJyBFRkEgc29sdXRpb24pIGFwcGVhciB0byBiZSBzbGlnaHRseSBtb3JlIHJlc29uYW50IHdpdGggdGhlIHJlbGF0aW9uc2hpcHMgb2JzZXJ2ZWQgYW1vbmcgYWR1bHRzLiBBbGwgb2YgdGhlc2UgaW50ZXItdW5pdCByZWxhdGlvbnNoaXBzIHdlcmUgc29tZXdhaHQgcG9zaXRpdmXigJRidXQgb25seSBzb21ld2hhdC4gVGhlcmUgd2FzIHNvbWUgZXZpZGVuY2Ugb2YgYXN5bW1ldHJpZXMgaW4gdGhlc2UgcG9zaXRpdmUgcmVsYXRpb25zaGlwcywgYnV0IHRoZXNlIGFzeW1tZXRyaWVzIHdlcmUgZ2VuZXJhbGx5IHdlYWtlciBhbmQgYXBwZWFyZWQgdG8gYmUgaGlnaGx5IGRlcGVuZGVudCBvbiB3aGljaCB0YXJnZXQgY2hhcmFjdGVyIHBhcnRpY2lwYW50cyBhc3Nlc3NlZCAocGFydGljdWxhcmx5IGZvciB0aGUgQk9EWSB2cy4gSEVBUlQgYW5kIEJPRFkgdnMuIE1JTkQgY29tcGFyaXNvbnMsIGFzIHdhcyB0aGUgY2FzZSBpbiBTdHVkeSAyIHdpdGggb2xkZXIgY2hpbGRyZW4pLgoKIyMjIyBBbmFseXNpcyBvZiBhc3ltbWV0cmllcwoKSGVyZSBJIHByb3ZpZGUgYSBmb3JtYWwgYW5hbHlzaXMgb2YgdGhlIGFzeW1tZXRyaWVzIChvciBsYWNrIHRoZXJlb2YpIHJldmVhbGVkIGJ5IHRoZSB2aXN1YWxpemF0aW9ucyBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4gQXMgaW4gcHJldmlvdXMgYW5hbHlzZXMsIGZvciBlYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cyAoQk9EWSB2cy4gSEVBUlQsIEJPRFkgdnMuIE1JTkQsIGFuZCBIRUFSVCB2cy4gTUlORCksIEkgdXNlZCBCYXllc2lhbiByZWdyZXNzaW9uIHRvIGNvbXBhcmUgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiB0aGVzZSB0d28gY29uY2VwdHVhbCB1bml0cyB0byB6ZXJvLCBjb250cm9sbGluZyBmb3IgZGlmZmVyZW5jZXMgaW4gYXNzZXNzbWVudHMgb2YgdGhlIHR3byAiZWRnZSBjYXNlcyIgdGhhdCB3ZXJlIGZlYXR1cmVkIGFzIHRhcmdldCBjaGFyYWN0ZXJzIGluIHRoZXNlIHN0dWRpZXMgKGJlZXRsZSBhbmQgcm9ib3QpLCBhbmQgYWNjb3VudGluZyBmb3IgdGhlIHdpdGhpbi1zdWJqZWN0cyBkZXNpZ24gb2YgdGhpcyBzdHVkeSBieSBpbmNsdWRpbmcgbWF4aW1hbCByYW5kb20gZWZmZWN0cyBzdHJ1Y3R1cmVzIChpbiB0aGlzIGNhc2UsIHJhbmRvbSBpbnRlcmNlcHRzIGZvciBwYXJ0aWNpcGFudHMpLiBTZWUgRmlndXJlIDQuWFgsIHBhbmVsIEIsIGZvciB2aXN1YWwgZGVwaWN0aW9ucyBvZiB0aGVzZSBkaWZmZXJlbmNlIHNjb3Jlcy4KCmBgYHtyfQpkNF80Nl9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX2Z1bihkNF80Nl9zY29yZWRfYWQpCmNvbnRyYXN0cyhkNF80Nl9zY29yZWRfYWRfZGlmZiRjaGFyYWN0ZXIpIDwtIGNvbnRyYXN0c19zdW1fZWRnZQoKc2F2ZVJEUyhkNF80Nl9zY29yZWRfYWRfZGlmZiwgIi4vc3RvcmVkL2RpZmZzY29yZV9kYXRhL2Q0XzQ2X3Njb3JlZF9hZF9kaWZmIikKYGBgCgpgYGB7cn0KcGxvdF9kNF80Nl9zY29yZWRfYWRfZGlmZiA8LSBkaWZmcGxvdF9mdW4oZDRfNDZfc2NvcmVkX2FkX2RpZmYpCmBgYAoKYGBge3J9CiMgcl9kNF80Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQiKQoKcl9kNF80Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCIpCgpzdW1tYXJ5KHJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCkKYGBgCgpgYGB7cn0KIyByX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0XzQ2X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiQk9EWSAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnN1bW1hcnkocl9kNF80Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kNF80Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIGJybSgKIyAgIGRpZmYgfiAxICsgY2hhcmFjdGVyICsgKDEgfCBzdWJpZCksCiMgICBkYXRhID0gZDRfNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJIRUFSVCAtIE1JTkQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQiKQoKcl9kNF80Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDRfNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCkKYGBgCgpgYGB7cn0KcmVndGFiX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmIDwtIGRpZmZfcmVnX3RhYmxlX2Z1bigKICByZWdfbGlzdCA9IGxpc3Qocl9kNF80Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2Q0XzQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKICAgICAgICAgICAgICAgICAgcl9kNF80Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKSwKICBwYWlyX2xpc3QgPSBjKCJCT0RZIC0gSEVBUlQiLCAiQk9EWSAtIE1JTkQiLCAiSEVBUlQgLSBNSU5EIiksCiAgc3R1ZHlfbmFtZSA9ICJDaGlsZHJlbiwgNC01eSAodXNpbmcgYWR1bHRzJyBzY2FsZXMpIiwKICBjaGFyX2xhYmVsID0gIlJvYm90IHZzLiBHTSIpCmBgYAoKYGBge3J9CiMgaW50ZXJpbSB0YWJsZSBmb3IgZWFzZSBvZiB3cml0aW5nCnJlZ3RhYl9kNF80Nl9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXN0dWR5LCAtcy5lLikgJT4lCiAgIyBmaWx0ZXIocGFyYW0gPT0gIkludGVyY2VwdCIpICU+JQogIGthYmxlKGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCnBsb3RfZDRfNDZfc2NvcmVkX2FkX2RpZmYKYGBgCgojIyMjIyBCT0RZIHZzLiBIRUFSVAoKQXMgYW1vbmcgYWR1bHRzLCBhbW9uZyBjaGlsZHJlbiBkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgc2NvcmVzIG9uIHRoZSBfQk9EWV8gYW5kIF9IRUFSVF8gc2NhbGVzIHdlcmUgc2lnbmlmaWNhbnRseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIF9CT0RZXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0hFQVJUXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLiBIb3dldmVyLCB0aGlzIGFzeW1tZXRyeSB3YXMgcmVkdWNlZCB0byB6ZXJvIGZvciBhc3Nlc3NtZW50cyBvZiB0aGUgcm9ib3QgKHNlZSB0aGUgIlRhcmdldCBjaGFyYWN0ZXIiIHJvdyBmb3IgdGhlICJCT0RZLUhFQVJUIiBjb21wYXJpc29uIGluIFRhYmxlIDQueCkuICAKCiMjIyMjIEJPRFkgdnMuIE1JTkQKCkluIGNvbnRyYXN0IHRvIGFkdWx0cywgYW1vbmcgY2hpbGRyZW4gZGlmZmVyZW5jZSBzY29yZXMgY29tcGFyaW5nIHNjb3JlcyBvbiB0aGUgX0JPRFlfIGFuZCBfTUlORF8gc2NhbGVzIHdlcmUgbm90IGRpZmZlcmVudGlhYmxlIGZyb20gemVybyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQueCkuIFRoaXMgYXBwZWFycyB0byBiZSBkdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGUgYXN5bW1ldHJ5IHJhbiBpbiBkaWZmZXJlbnQgZGlyZWN0aW9ucyBmb3IgdGhlIHR3byB0YXJnZXQgY2hhcmFjdGVycyAoc2VlIHRoZSAiVGFyZ2V0IGNoYXJhY3RlciIgcm93IGZvciB0aGUgIkJPRFktTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLiAgCgojIyMjIyBIRUFSVCB2cy4gTUlORAoKQXMgYW1vbmcgYWR1bHRzLCBhbW9uZyBjaGlsZHJlbiBkaWZmZXJlbmNlIHNjb3JlcyBjb21wYXJpbmcgc2NvcmVzIG9uIHRoZSBfSEVBUlRfIGFuZCBfTUlORF8gc2NhbGVzIHdlcmUgc3Vic3RhbnRpYWxseSBub24temVybywgaW4gdGhlIGRpcmVjdGlvbiBvZiBwYXJ0aWNpcGFudHMgZW5kb3JzaW5nIF9NSU5EXyBpdGVtcyBtb3JlIHN0cm9uZ2x5IHRoYW4gX0hFQVJUXyBpdGVtcyAoc2VlIHRoZSAiSW50ZXJjZXB0IiByb3cgZm9yIHRoZSAiSEVBUlQtTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLCBhbmQgdGhpcyBkaWZmZXJlbmNlIHdhcyBzbGlnaHRseSBleGFnZ2VyYXRlZCBpbiBhc3Nlc3NtZW50cyBvZiB0aGUgcm9ib3Qoc2VlIHRoZSAiVGFyZ2V0IGNoYXJhY3RlciIgcm93IGZvciB0aGUgIkhFQVJULU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KS4KCiMjIyMjIEludGVyaW0gZGlzY3Vzc2lvbgoKVGhlc2UgZm9ybWFsIGFuYWx5c2VzIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGFjcm9zcyB0aGUgX0JPRFlfLCBfSEVBUlRfLCBhbmQgX01JTkRfIHNjYWxlcyBhbW9uZyBjaGlsZHJlbiBpbiBTdHVkeSA0IGNvbmZpcm0gbXkgaW5mb3JtYWwgb2JzZXJ2YXRpb25zIHRoYXQgaW4gdGhpcyBwYXJ0aWN1bGFybHkgY2hpbGQtZnJpZW5kbHkgcGFyYWRpZ20sIHlvdW5nIGNoaWxkcmVuIHdlcmUgYWR1bHQtbGlrZSBpbiB0aGVpciB0ZW5kZW5jeSB0byBlbmRvcnNlIEJPRFkgYW5kIE1JTkQgbW9yZSBzdHJvbmdseSB0aGFuIEhFQVJULCB3aGlsZSBmYWlsaW5nIHRvIHNob3cgdGhlIGFkdWx0LWxpa2UgdGVuZGVuY3kgdG8gZW5kb3JzZSBNSU5EIG1vcmUgc3Ryb25nbHkgdGhhbiBCT0RZIGZvciB0aGVzZSB0d28gZWRnZSBjYXNlcy4gSW5zdGVhZCwgbGlrZSBjaGlsZHJlbiBpbiBvdGhlciBzdHVkaWVzIChYWCBfX0lOU0VSVCBSRUZFUkVOQ0VTX18pLCB0aGUgYXN5bW1ldHJ5IGJldHdlZW4gQk9EWSBhbmQgTUlORCBhcHBlYXJlZCB0byBkZXBlbmQgb24gd2hpY2ggdGFyZ2V0IHdhcyBiZWluZyBhc3Nlc3NlZC4KCmBgYHtyfQpwbG90c19hZ2VncF9kNF9zY29yZWRfYWQgPC0gcmVsdml6X2FnZWdwX2Z1bigKICBkX3Njb3JlZCA9IGQ0X2FkX3Njb3JlZF9hZCAlPiUgCiAgICBmdWxsX2pvaW4oZDRfNDZfc2NvcmVkX2FkKSwgCiAgYWdlX2dyb3VwcyA9IGMoImNoaWxkcmVuNDYiLCAiYWR1bHRzIiksCiAgYWdlX2dyb3VwX2xhYmVscyA9IGMoIkNoaWxkcmVuICg0LTV5KSIsICJBZHVsdHMiKSwKICBjb2xvcnMgPSBjb2xvcnMwMikKYGBgCgpgYGB7cn0KZmlnX2Q0X2FsbF9zY29yZWRfYWRfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2FnZWdwX2Q0X3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19hZ2VncF9kNF9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfYWdlZ3BfZDRfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkMxIiwgIkMyIiwgIkMzIiksIG5jb2wgPSAzKQoKZmlnX2Q0X2FsbF9zY29yZWRfYWRfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfYWdlZ3BfZDRfc2NvcmVkX2FkW1sxXV0gKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCgiVGFyZ2V0IGNoYXJhY3RlciIsIHZhbHVlcyA9IGNvbG9yczAyLAogICAgICAgICAgICAgICAgICAgICAgIG5hLnRyYW5zbGF0ZSA9IEYsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkpCgpmaWdfZDRfYWxsX3Njb3JlZF9hZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKAogIGZpZ19kNF9hbGxfc2NvcmVkX2FkX3Bsb3RzLCBmaWdfZDRfYWxsX3Njb3JlZF9hZF9sZWcsCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1KSkKCmZpZ19kNF9hbGxfc2NvcmVkX2FkX3RpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiVHJhY2tpbmcgZGV2ZWxvcG1lbnQgYmV0d2VlbiA0LTV5IGFuZCBhZHVsdGhvb2QgKHNjb3JlZCB1c2luZyBhZHVsdHMnIHNjYWxlcykiLCBzaXplID0gMTYsIGZvbnRmYWNlID0gJ2JvbGQnLCB4ID0gMCwgaGp1c3QgPSAwKQoKZmlnX2Q0X2FsbF9zY29yZWRfYWRfcGxvdHNfbGVnX3RpdGxlIDwtIHBsb3RfZ3JpZCgKICBmaWdfZDRfYWxsX3Njb3JlZF9hZF90aXRsZSwgZmlnX2Q0X2FsbF9zY29yZWRfYWRfcGxvdHNfbGVnLAogIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMC4xMiwgMSkpCmBgYAoKYGBge3J9CmZpZ3VyZTQueCA8LSBwbG90X2dyaWQoZmlnX2Q0X2FkX3Bsb3RzX2xlZ190aXRsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgZmlnX2Q0XzQ2X3Bsb3RzX2xlZ190aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICBmaWdfZDRfYWxsX3Njb3JlZF9hZF9wbG90c19sZWdfdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgbmNvbCA9IDEpCgpmaWd1cmU0LnhfY2FwIDwtIGFkZF9zdWIoZmlndXJlNC54LCBzdHJfd3JhcCgiRmlndXJlIDQueDogUmVsYXRpb25zaGlwcyBhbW9uZyBVUyBhZHVsdHMnLCBvbGRlciBjaGlsZHJlbidzLCBhbmQgeW91bmdlciBjaGlsZHJlbidzIGF0dHJpYnV0aW9ucyBvZiBjb25jZXB0dWFsIHVuaXRzIGluIFN0dWR5IDQsIHNjb3JlZCB1c2luZyBhZHVsdHMnIEJPRFksIEhFQVJULCBhbmQgTUlORCBzY2FsZXMgKHNlZSBUYWJsZSA0LngpLiBQbG90cyBhcmUgb3JnYW5pemVkIGJ5IHNhbXBsZSAocm93cykgYW5kIGJ5IHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cyAoY29sdW1ucykuIChBKSBBZHVsdHMuIChCKSBDaGlsZHJlbiAoNC02eSBvZiBhZ2UpLCBzY29yZWQgdXNpbmcgYWR1bHRzJyBzY2FsZXMuIChDKSBBIHZpc3VhbGl6YXRpb24gb2YgZGV2ZWxvcG1lbnQgYmV0d2VlbiA0LTZ5IGFuZCBhZHVsdGhvb2QsIHVzaW5nIG1lYW4gc2NvcmVzIGJ5IGNoYXJhY3RlciBhbmQgYWdlIGdyb3VwLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMS4gSW4gcGFuZWxzIEEtQiwgaW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYXJlIHBsb3R0ZWQgYXMgc21hbGwsIHRyYW5zbHVjZW50IGNpcmNsZXMsIGFuZCBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZC4iLCAxMTApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDEuNH0KZ2dkcmF3KGZpZ3VyZTQueF9jYXApCmBgYAoKIyMjIERldmVsb3BtZW50YWwgY29tcGFyaXNvbgoKSW4gdGhlIHByZXZpb3VzIHNlY3Rpb25zLCBJIGFuYWx5emVkIGFkdWx0cycgYW5kIGNoaWxkcmVuJ3MgcmVzcG9uc2VzIHNlcGFyYXRlbHkuIEhlcmUgSSBjb25kdWN0IGEgZm9ybWFsIGNvbXBhcmlzb24gb2YgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBjb25jZXB0dWFsIHVuaXRzIGFtb25nIHRoZXNlIHR3byBhZ2UgZ3JvdXBzLCB0byBhc3Nlc3MgdGhlIHNpemUgYW5kIHJvYnVzdG5lc3Mgb2YgdGhlc2Ugb3N0ZW5zaXZlIGRldmVsb3BtZW50YWwgZGlmZmVyZW5jZXMuCgpgYGB7cn0KZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZiA8LSBmdWxsX2pvaW4oZDRfYWRfc2NvcmVkX2FkX2RpZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ0XzQ2X3Njb3JlZF9hZF9kaWZmKSAlPiUKICBtdXRhdGUoYWdlX2dyb3VwID0gZmFjdG9yKGFnZV9ncm91cCkpCmNvbnRyYXN0cyhkNF9hZDQ2X3Njb3JlZF9hZF9kaWZmJGNoYXJhY3RlcikgPC0gY29udHJhc3RzX3N1bV9lZGdlCmNvbnRyYXN0cyhkNF9hZDQ2X3Njb3JlZF9hZF9kaWZmJGFnZV9ncm91cCkgPC0gY29udHJhc3RzX2R1bTJfYWdlZ3AKYGBgCgpgYGB7cn0KIyByX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9IRUFSVCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciAqIGFnZV9ncm91cCArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0X2FkNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gSEVBUlQiKSwKIyAgIGNvcmVzID0gNCkKIyAKIyBzYXZlUkRTKHJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAojICAgICAgICAgIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIDwtIHJlYWRSRFMoIi4vc3RvcmVkL2JybXNfbW9kZWxzL3JfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJUIikKCnN1bW1hcnkocl9kNF9hZDQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfSEVBUlQpCmBgYAoKYGBge3J9CiMgcl9kNF9hZDQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCA8LSBicm0oCiMgICBkaWZmIH4gMSArIGNoYXJhY3RlciAqIGFnZV9ncm91cCArICgxIHwgc3ViaWQpLAojICAgZGF0YSA9IGQ0X2FkNDZfc2NvcmVkX2FkX2RpZmYgJT4lIGZpbHRlcihwYWlyID09ICJCT0RZIC0gTUlORCIpLAojICAgY29yZXMgPSA0KQojIAojIHNhdmVSRFMocl9kNF9hZDQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5EIikKCnJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQgPC0gcmVhZFJEUygiLi9zdG9yZWQvYnJtc19tb2RlbHMvcl9kNF9hZDQ2X3Njb3JlZF9hZF9kaWZmX0JPRFlfTUlORCIpCgpzdW1tYXJ5KHJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX01JTkQpCmBgYAoKYGBge3J9CiMgcl9kNF9hZDQ2X3Njb3JlZF9hZF9kaWZmX0hFQVJUX01JTkQgPC0gYnJtKAojICAgZGlmZiB+IDEgKyBjaGFyYWN0ZXIgKiBhZ2VfZ3JvdXAgKyAoMSB8IHN1YmlkKSwKIyAgIGRhdGEgPSBkNF9hZDQ2X3Njb3JlZF9hZF9kaWZmICU+JSBmaWx0ZXIocGFpciA9PSAiSEVBUlQgLSBNSU5EIiksCiMgICBjb3JlcyA9IDQpCiMgCiMgc2F2ZVJEUyhyX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCwKIyAgICAgICAgICIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpyX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCA8LSByZWFkUkRTKCIuL3N0b3JlZC9icm1zX21vZGVscy9yX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCIpCgpzdW1tYXJ5KHJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9IRUFSVF9NSU5EKQpgYGAKCmBgYHtyfQpyZWd0YWJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZiA8LSBkaWZmX3JlZ190YWJsZV9mdW4oCiAgcmVnX2xpc3QgPSBsaXN0KHJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZl9CT0RZX0hFQVJULAogICAgICAgICAgICAgICAgICByX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfQk9EWV9NSU5ELAogICAgICAgICAgICAgICAgICByX2Q0X2FkNDZfc2NvcmVkX2FkX2RpZmZfSEVBUlRfTUlORCksCiAgcGFpcl9saXN0ID0gYygiQk9EWSAtIEhFQVJUIiwgIkJPRFkgLSBNSU5EIiwgIkhFQVJUIC0gTUlORCIpLAogIHN0dWR5X25hbWUgPSAiRGV2ZWxvcG1lbnRhbCBjb21wYXJpc29uIiwKICBjaGFyX2xhYmVsID0gIlJvYm90IHZzLiBHTSIsIAogIGFnZWdwX2xhYmVsID0gIkNoaWxkcmVuIHZzLiBhZHVsdHMiKQpgYGAKCmBgYHtyfQojIGludGVyaW0gdGFibGUgZm9yIGVhc2Ugb2Ygd3JpdGluZwpyZWd0YWJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXN0dWR5LCAtcy5lLikgJT4lCiAgIyBmaWx0ZXIocGFyYW0gJWluJSBjKCJDaGlsZHJlbiB2cy4gYWR1bHRzIiwgIkludGVyYWN0aW9uIikpICU+JQogIGthYmxlKGRpZ2l0cyA9IDIpICU+JQogIGthYmxlX3N0eWxpbmcoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQojIGludGVyaW0gcGxvdCBmb3IgZWFzZSBvZiB3cml0aW5nCnBsb3RfZ3JpZChwbG90X2Q0X2FkX3Njb3JlZF9hZF9kaWZmLCBwbG90X2Q0XzQ2X3Njb3JlZF9hZF9kaWZmLCBuY29sID0gMikKYGBgCgojIyMjIyBCT0RZIHZzLiBIRUFSVAoKRGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiB0aGUgX0JPRFlfIGFuZCBfSEVBUlRfIHNjYWxlcyB3ZXJlIHN1YnN0YW50aWFsbHkgY2xvc2VyIHRvIHplcm8gYW1vbmcgY2hpbGRyZW4sIGFzIGNvbXBhcmVkIHRvIGFkdWx0cyAoc2VlIHRoZSAiQ2hpbGRyZW4gdnMuIGFkdWx0cyIgcm93IGZvciB0aGUgIkJPRFktSEVBUlQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KSwgYW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMgd2FzIGF0dGVudWF0ZWQgYW1vbmcgY2hpbGRyZW4gKHNlZSB0aGUgIkludGVyYWN0aW9uIiByb3cgZm9yIHRoZSAiQk9EWS1IRUFSVCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLiAgCgojIyMjIyBCT0RZIHZzLiBNSU5ECgpEaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIHRoZSBfQk9EWV8gYW5kIF9NSU5EXyBzY2FsZXMgd2VyZSBzdWJzdGFudGlhbGx5IGNsb3NlciB0byB6ZXJvIGFtb25nIGNoaWxkcmVuLCBhcyBjb21wYXJlZCB0byBhZHVsdHMgKHNlZSB0aGUgIkNoaWxkcmVuIHZzLiBhZHVsdHMiIHJvdyBmb3IgdGhlICJCT0RZLU1JTkQiIGNvbXBhcmlzb24gaW4gVGFibGUgNC54KSwgYW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMgd2FzIGF0dGVudWF0ZWQgYW1vbmcgY2hpbGRyZW4gKHNlZSB0aGUgIkludGVyYWN0aW9uIiByb3cgZm9yIHRoZSAiQk9EWS1NSU5EIiBjb21wYXJpc29uIGluIFRhYmxlIDQueCkuICAKCiMjIyMjIEhFQVJUIHZzLiBNSU5ECgpEaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIHRoZSBfSEVBUlRfIGFuZCBfTUlORF8gc2NhbGVzIHdlcmUgc3Vic3RhbnRpYWxseSBjbG9zZXIgdG8gemVybyBhbW9uZyBjaGlsZHJlbiwgYXMgY29tcGFyZWQgdG8gYWR1bHRzIChzZWUgdGhlICJDaGlsZHJlbiB2cy4gYWR1bHRzIiByb3cgZm9yIHRoZSAiSEVBUlQtTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLCBhbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycyAgd2FzIGF0dGVudWF0ZWQgYW1vbmcgY2hpbGRyZW4gKHNlZSB0aGUgIkludGVyYWN0aW9uIiByb3cgZm9yIHRoZSAiSEVBUlQtTUlORCIgY29tcGFyaXNvbiBpbiBUYWJsZSA0LngpLiAgCgojIyMjIyBJbnRlcmltIGRpc2N1c3Npb24KClRoZXNlIGZvcm1hbCBjb21wYXJpc29ucyBvZiBkaWZmZXJlbmNlIHNjb3JlcyBhbW9uZyBjaGlsZHJlbiB2cy4gYWR1bHRzIGluIFN0dWR5IDQgY29uZmlybSBteSBlYXJsaWVyIG9ic2VydmF0aW9ucyB0aGF0IGFzeW1tZXRyaWVzIHdlcmUgc3Vic3RhbnRpYWxseSBhdHRlbnVhdGVkIChhbmQgaW4gc29tZSBjYXNlcywgcmVkdWNlZCB0byB6ZXJvKSBhbW9uZyBjaGlsZHJlbiwgcmVsYXRpdmUgdG8gdGhlIGJhc2VsaW5lIHNldCBieSBhZHVsdHMuIEluIGFkZGl0aW9uLCBhbW9uZyBjaGlsZHJlbiB0aGUgZGlmZmVyZW5jZXMgaW4gdGhlc2UgYXN5bW1ldHJpZXMgYmV0d2VlbiB0aGUgdHdvICJlZGdlIGNhc2VzIiBpbmNsdWRlZCBpbiB0aGlzIHN0dWR5ICh0aGUgYmVldGxlIHZzLiB0aGUgcm9ib3QpIHdlcmUgYWxzbyBhdHRlbnVhdGVkLCByZWxhdGl2ZSB0byBhZHVsdHMuCgojIyBEaXNjdXNzaW9uCgpYWCBfX0lOU0VSVCBTVFVEWSA0IERJU0NVU1NJT05fXwoKYGBge3J9CnNjYWxlc19zdHVkeTQgPC0gYmluZF9yb3dzKHNjYWxlc19lZmFfd2RtX2Q0X2FkICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3R1ZHkgPSAiU3R1ZHkgNDogQWR1bHRzIikpICU+JQogIHNlbGVjdCgtYyhsb2FkaW5nLCBvcmRlcikpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgc3ByZWFkKHN0dWR5LCBmYWN0b3IpICU+JQogIG11dGF0ZSh1cl9mYWN0b3IgPSBgU3R1ZHkgNDogQWR1bHRzYCkgJT4lCiAgbGVmdF9qb2luKHNjYWxlc19lZmFfd2RtX2Q0X2FkICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoY2FwYWNpdHksIG9yZGVyKSAlPiUgcmVuYW1lKG9yZGVyX2FkID0gb3JkZXIpKSAlPiUKICBhcnJhbmdlKHVyX2ZhY3Rvciwgb3JkZXJfYWQpICU+JQogIHNlbGVjdCgtdXJfZmFjdG9yKSAjJT4lCiMgc2VsZWN0KC1zdGFydHNfd2l0aCgib3JkZXIiKSkKYGBgCgpgYGB7cn0KdGFibGU0LnggPC0gc2NhbGVzX3N0dWR5MiAlPiUgCiAgbXV0YXRlKGNhcGFjaXR5ID0gY2FzZV93aGVuKAogICAgZ3JlcGwoInNhZCIsIGNhcGFjaXR5KSB+ICJmZWVsL2dldCBzYWQiLAogICAgZ3JlcGwoInNjYXJlZCIsIGNhcGFjaXR5KSB+ICJmZWVsL2dldCBzY2FyZWQiLAogICAgZ3JlcGwoImhlYXIiLCBjYXBhY2l0eSkgfiAiaGVhciBbc291bmRzXSIsCiAgICBncmVwbCgic2VlIiwgY2FwYWNpdHkpIH4gInNlZSBbdGhpbmdzXSIsCiAgICBncmVwbCgiaHVuZ3J5IiwgY2FwYWNpdHkpIH4gImdldC9mZWVsIGh1bmdyeSIsCiAgICBncmVwbCgic2ljayIsIGNhcGFjaXR5KSB+ICJnZXQvZmVlbCBzaWNrWy4uLl0iLAogICAgZ3JlcGwoInRob3VnaHRzIiwgY2FwYWNpdHkpIHwgZ3JlcGwoInRoaW5rIiwgY2FwYWNpdHkpIH4gImhhdmUgdGhvdWdodHMvdGhpbmsiLAogICAgZ3JlcGwoImZpZ3VyZSIsIGNhcGFjaXR5KSB+ICJmaWd1cmUgb3V0IGhvdyB0byBkbyB0aGluZ3MvZmlndXJlIHRoaW5ncyBvdXQiLAogICAgZ3JlcGwoImxvdmUiICxjYXBhY2l0eSkgfiAiZmVlbCBsb3ZlL2xvdmUgc29tZW9uZSIsCiAgICBncmVwbCgiZ3VpbHQiLCBjYXBhY2l0eSkgfCBncmVwbCgic29ycnkiLCBjYXBhY2l0eSkgfiAiZmVlbCBndWlsdHkvc29ycnkiLAogICAgVFJVRSB+IGNhcGFjaXR5KSkgJT4lCiAgcmVuYW1lKG9yZGVyX2FkX3MyID0gb3JkZXJfYWQsCiAgICAgICAgIG9yZGVyXzc5X3MyID0gb3JkZXJfNzkpICU+JQogIGZ1bGxfam9pbihzY2FsZXNfc3R1ZHkzICU+JQogICAgICAgICAgICAgIG11dGF0ZShjYXBhY2l0eSA9IGNhc2Vfd2hlbigKICAgICAgICAgICAgICAgIGdyZXBsKCJzYWQiLCBjYXBhY2l0eSkgfiAiZmVlbC9nZXQgc2FkIiwKICAgICAgICAgICAgICAgIGdyZXBsKCJzY2FyZWQiLCBjYXBhY2l0eSkgfiAiZmVlbC9nZXQgc2NhcmVkIiwKICAgICAgICAgICAgICAgIGdyZXBsKCJoZWFyIiwgY2FwYWNpdHkpIH4gImhlYXIgW3NvdW5kc10iLAogICAgICAgICAgICAgICAgZ3JlcGwoInNlZSIsIGNhcGFjaXR5KSB+ICJzZWUgW3RoaW5nc10iLAogICAgICAgICAgICAgICAgZ3JlcGwoImh1bmdyeSIsIGNhcGFjaXR5KSB+ICJnZXQvZmVlbCBodW5ncnkiLAogICAgICAgICAgICAgICAgZ3JlcGwoInNpY2siLCBjYXBhY2l0eSkgfiAiZ2V0L2ZlZWwgc2lja1suLi5dIiwKICAgICAgICAgICAgICAgIGdyZXBsKCJ0aG91Z2h0cyIsIGNhcGFjaXR5KSB8IGdyZXBsKCJ0aGluayIsIGNhcGFjaXR5KSB+ICJoYXZlIHRob3VnaHRzL3RoaW5rIiwKICAgICAgICAgICAgICAgIGdyZXBsKCJmaWd1cmUiLCBjYXBhY2l0eSkgfiAiZmlndXJlIG91dCBob3cgdG8gZG8gdGhpbmdzL2ZpZ3VyZSB0aGluZ3Mgb3V0IiwKICAgICAgICAgICAgICAgIGdyZXBsKCJsb3ZlIiwgY2FwYWNpdHkpIH4gImZlZWwgbG92ZS9sb3ZlIHNvbWVvbmUiLAogICAgICAgICAgICAgICAgZ3JlcGwoImd1aWx0IiwgY2FwYWNpdHkpIHwgZ3JlcGwoInNvcnJ5IiwgY2FwYWNpdHkpIH4gImZlZWwgZ3VpbHR5L3NvcnJ5IiwKICAgICAgICAgICAgICAgIFRSVUUgfiBjYXBhY2l0eSkpICU+JQogICAgICAgICAgICAgIHJlbmFtZShvcmRlcl9hZF9zMyA9IG9yZGVyX2FkLAogICAgICAgICAgICAgICAgICAgICBvcmRlcl83OV9zMyA9IG9yZGVyXzc5KSkgJT4lCiAgZnVsbF9qb2luKHNjYWxlc19zdHVkeTQgJT4lCiAgICAgICAgICAgICAgbXV0YXRlKGNhcGFjaXR5ID0gY2FzZV93aGVuKAogICAgICAgICAgICAgICAgZ3JlcGwoInNhZCIsIGNhcGFjaXR5KSB+ICJmZWVsL2dldCBzYWQiLAogICAgICAgICAgICAgICAgZ3JlcGwoInNjYXJlZCIsIGNhcGFjaXR5KSB+ICJmZWVsL2dldCBzY2FyZWQiLAogICAgICAgICAgICAgICAgZ3JlcGwoImhlYXIiLCBjYXBhY2l0eSkgfiAiaGVhciBbc291bmRzXSIsCiAgICAgICAgICAgICAgICBncmVwbCgic2VlIiwgY2FwYWNpdHkpIH4gInNlZSBbdGhpbmdzXSIsCiAgICAgICAgICAgICAgICBncmVwbCgiaHVuZ3J5IiwgY2FwYWNpdHkpIH4gImdldC9mZWVsIGh1bmdyeSIsCiAgICAgICAgICAgICAgICBncmVwbCgic2ljayIsIGNhcGFjaXR5KSB+ICJnZXQvZmVlbCBzaWNrWy4uLl0iLAogICAgICAgICAgICAgICAgZ3JlcGwoInRob3VnaHRzIiwgY2FwYWNpdHkpIHwgZ3JlcGwoInRoaW5rIiwgY2FwYWNpdHkpIH4gImhhdmUgdGhvdWdodHMvdGhpbmsiLAogICAgICAgICAgICAgICAgZ3JlcGwoImZpZ3VyZSIsIGNhcGFjaXR5KSB+ICJmaWd1cmUgb3V0IGhvdyB0byBkbyB0aGluZ3MvZmlndXJlIHRoaW5ncyBvdXQiLAogICAgICAgICAgICAgICAgZ3JlcGwoImxvdmUiLCBjYXBhY2l0eSkgfiAiZmVlbCBsb3ZlL2xvdmUgc29tZW9uZSIsCiAgICAgICAgICAgICAgICBncmVwbCgiZ3VpbHQiLCBjYXBhY2l0eSkgfCBncmVwbCgic29ycnkiLCBjYXBhY2l0eSkgfiAiZmVlbCBndWlsdHkvc29ycnkiLAogICAgICAgICAgICAgICAgVFJVRSB+IGNhcGFjaXR5KSkgJT4lCiAgICAgICAgICAgICAgcmVuYW1lKG9yZGVyX2FkX3M0ID0gb3JkZXJfYWQpKSAlPiUKICBtdXRhdGUodXJfZmFjdG9yID0gY2FzZV93aGVuKAogICAgIWlzLm5hKGBBZHVsdHNgKSB+IGBBZHVsdHNgLAogICAgIWlzLm5hKGBDaGlsZHJlbiwgNy05eWApIH4gYENoaWxkcmVuLCA3LTl5YCwKICAgICFpcy5uYShgU3R1ZHkgMzogQWR1bHRzYCkgfiBgU3R1ZHkgMzogQWR1bHRzYCwKICAgICFpcy5uYShgU3R1ZHkgMzogQ2hpbGRyZW4sIDctOXlgKSB+IGBTdHVkeSAzOiBDaGlsZHJlbiwgNy05eWAsCiAgICAhaXMubmEoYFN0dWR5IDQ6IEFkdWx0c2ApIH4gYFN0dWR5IDQ6IEFkdWx0c2AsCiAgICBUUlVFIH4gTkFfaW50ZWdlcl8pKSAlPiUKICBtdXRhdGUodXJfZmFjdG9yID0gZmFjdG9yKHVyX2ZhY3RvciwgbGV2ZWxzID0gYygiQk9EWSIsICJIRUFSVCIsICJNSU5EIikpKSAlPiUKICBhcnJhbmdlKHVyX2ZhY3Rvciwgb3JkZXJfYWRfczIsIG9yZGVyXzc5X3MyLCBvcmRlcl9hZF9zMywgb3JkZXJfYWRfczQpICU+JQogIHNlbGVjdCgtdXJfZmFjdG9yLCAtc3RhcnRzX3dpdGgoIm9yZGVyIikpICU+JQogIG11dGF0ZV9hdCh2YXJzKC1jYXBhY2l0eSksCiAgICAgICAgICAgIGZ1bnMoaWZlbHNlKGlzLm5hKC4pLCAiIiwgIuKckyIpKSkgJT4lCiAgcmVuYW1lKENhcGFjaXR5ID0gY2FwYWNpdHksCiAgICAgICAgIGBBZHVsdHNgID0gYFN0dWR5IDM6IEFkdWx0c2AsCiAgICAgICAgIGBDaGlsZHJlbiwgNy05eWAgPSBgU3R1ZHkgMzogQ2hpbGRyZW4sIDctOXlgLAogICAgICAgICBgQWR1bHRzYCA9IGBTdHVkeSA0OiBBZHVsdHNgKSAlPiUKICBrYWJsZShmb3JtYXQgPSAiaHRtbCIsCiAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSA0Lng6IFNjYWxlcyBmb3IgZWFjaCBvZiB0aGUgY29uY2VwdHVhbCB1bml0cyAoZmFjdG9ycykgaWRlbnRpZmllZCBieSBFRkEgZm9yIFVTIEFkdWx0cyBpbiBTdHVkaWVzIDItNCBhbmQgZm9yIDctIHRvIDkteWVhci1vbGQgY2hpbGRyZW5pbiBTdHVkaWVzIDIgYW5kIDMuIChTZWUgQXBwZW5kaXggQiBmb3IgYWx0ZXJuYXRpdmUgc2NhbGVzIGJhc2VkIG9uIHlvdW5nZXIgY2hpbGRyZW4ncyBFRkEgcmVzdWx0cywgZm9yIFN0dWRpZXMgMyBhbmQgNC4pIEEgY2hlY2ttYXJrIGluZGljYXRlcyB0aGF0IGEgbWVudGFsIGNhcGFjaXR5IHdhcyBpbmNsdWRlZCBpbiBhIHNjYWxlIGZvciBhIHBhcnRpY3VsYXIgc2FtcGxlLiIpICU+JQogIGthYmxlX3N0eWxpbmcoKSAlPiUKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMSwKICAgICAgICAgICAgICAgICAgICAgIlN0dWR5IDIiID0gMiwKICAgICAgICAgICAgICAgICAgICAgIlN0dWR5IDMiID0gMiwKICAgICAgICAgICAgICAgICAgICAgIlN0dWR5IDQiID0gMSkpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgc2NhbGUiLCAxLCA5KSAlPiUKICBncm91cF9yb3dzKCJIRUFSVCBzY2FsZSIsIDEwLCAxOSkgJT4lCiAgZ3JvdXBfcm93cygiTUlORCBzY2FsZSIsIDIwLCAzMSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CnRhYmxlNC54CmBgYAoKYGBge3J9CnBsb3RzX2FnZWdwX2Q0X3Njb3JlZF9hZCA8LSByZWx2aXpfYWdlZ3BfZnVuKAogIGRfc2NvcmVkID0gZDRfYWRfc2NvcmVkX2FkICU+JSAKICAgIGZ1bGxfam9pbihkNF80Nl9zY29yZWRfYWQpLCAKICBhZ2VfZ3JvdXBzID0gYygiY2hpbGRyZW40NiIsICJhZHVsdHMiKSwKICBhZ2VfZ3JvdXBfbGFiZWxzID0gYygiQ2hpbGRyZW4sICg0LTV5KSIsICJBZHVsdHMiKSwKICBjb2xvcnMgPSBjb2xvcnMwMikKYGBgCgpgYGB7cn0KZmlnX2Q0X2FsbF9zY29yZWRfYWRfcGxvdHMgPC0gcGxvdF9ncmlkKHBsb3RzX2FnZWdwX2Q0X3Njb3JlZF9hZFtbMV1dICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG90c19hZ2VncF9kNF9zY29yZWRfYWRbWzJdXSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdHNfYWdlZ3BfZDRfc2NvcmVkX2FkW1szXV0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkQxIiwgIkQyIiwgImQ0IiksIG5jb2wgPSAzKQoKZmlnX2Q0X2FsbF9zY29yZWRfYWRfbGVnIDwtIGdldF9sZWdlbmQoCiAgcGxvdHNfYWdlZ3BfZDRfc2NvcmVkX2FkW1sxXV0gKyAKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwoIlRhcmdldCBjaGFyYWN0ZXIiLCB2YWx1ZXMgPSBjb2xvcnMwMiwgbmEudHJhbnNsYXRlID0gRiwgCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQodGl0bGUucG9zaXRpb24gPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAyKSkpCgpmaWdfZDRfYWxsX3Njb3JlZF9hZF9wbG90c19sZWcgPC0gcGxvdF9ncmlkKGZpZ19kNF9hbGxfc2NvcmVkX2FkX3Bsb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZ19kNF9hbGxfc2NvcmVkX2FkX2xlZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDEsIDAuMDUpKQoKZmlnX2Q0X2FsbF9zY29yZWRfYWRfdGl0bGUgPC0gZ2dkcmF3KCkgKyAKICBkcmF3X2xhYmVsKCJUcmFja2luZyBkZXZlbG9wbWVudCBiZXR3ZWVuIDQtNXkgYW5kIGFkdWx0aG9vZCAoc2NvcmVkIHVzaW5nIGFkdWx0cycgc2NhbGVzKSIsIHNpemUgPSAxNiwgZm9udGZhY2UgPSAnYm9sZCcsIHggPSAwLCBoanVzdCA9IDApCgpmaWdfZDRfYWxsX3Njb3JlZF9hZF9wbG90c19sZWdfdGl0bGUgPC0gcGxvdF9ncmlkKAogIGZpZ19kNF9hbGxfc2NvcmVkX2FkX3RpdGxlLCBmaWdfZDRfYWxsX3Njb3JlZF9hZF9wbG90c19sZWcsCiAgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYygwLjEyLCAxKSkKYGBgCgpgYGB7cn0KZmlndXJlNC54IDwtIHBsb3RfZ3JpZChmaWdfZDRfYWRfcGxvdHNfbGVnX3RpdGxlLCAKICAgICAgICAgICAgICAgICAgICAgICBmaWdfZDRfNDZfcGxvdHNfbGVnX3RpdGxlLAogICAgICAgICAgICAgICAgICAgICAgIGZpZ19kNF9hbGxfc2NvcmVkX2FkX3Bsb3RzX2xlZ190aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMSkKCmZpZ3VyZTQueF9jYXAgPC0gYWRkX3N1YihmaWd1cmU0LngsIHN0cl93cmFwKCJGaWd1cmUgNC54OiBSZWxhdGlvbnNoaXBzIGFtb25nIFVTIGFkdWx0cycgYW5kIGNoaWxkcmVuJ3MgYXR0cmlidXRpb25zIG9mIGNvbmNlcHR1YWwgdW5pdHMgaW4gU3R1ZHkgNCwgc2NvcmVkIHVzaW5nIGFkdWx0cycgQk9EWSwgSEVBUlQsIGFuZCBNSU5EIHNjYWxlcyAoc2VlIFRhYmxlIDQueCkuIChBKSBBZHVsdHMuIChCKSBDaGlsZHJlbiAoNC01eSBvZiBhZ2UpLiAoQykgQSB2aXN1YWxpemF0aW9uIG9mIGRldmVsb3BtZW50IGJldHdlZW4gNC01eSBhbmQgYWR1bHRob29kLCB1c2luZyBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYW5kIGFnZSBncm91cC4gUGxvdHMgYXJlIG9yZ2FuaXplZCBieSBzYW1wbGUgKHJvd3MpIGFuZCBieSBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKGNvbHVtbnMpLiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMS4gSW4gcGFuZWxzIEEtQiwgaW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgYXJlIHBsb3R0ZWQgYXMgc21hbGwsIHRyYW5zbHVjZW50IGNpcmNsZXMsIGFuZCBtZWFuIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZC4iLCAxMTApLCB4ID0gMCwgaGp1c3QgPSAwKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDEuNH0KZ2dkcmF3KGZpZ3VyZTQueF9jYXApCmBgYAoKYGBge3J9CmZpZ3VyZTQueF9wbG90cyA8LSBwbG90X2dyaWQoCiAgcGxvdF9kNF9hZF9zY29yZWRfYWRfZGlmZiArCiAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDQ6IEFkdWx0cyIpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSwKICBwbG90X2Q0XzQ2X3Njb3JlZF9hZF9kaWZmICsgCiAgICBsYWJzKHRpdGxlID0gIlN0dWR5IDQ6IENoaWxkcmVuLCA0LTV5IChzY29yZWQgdXNpbmcgYWR1bHRzJyBzY2FsZXMpIikgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpLCAKICBuY29sID0gMiwgcmVsX3dpZHRocyA9IGMoMSwgMSksCiAgbGFiZWxzID0gIkFVVE8iKQoKZmlndXJlNC54X2NhcCA8LSBhZGRfc3ViKGZpZ3VyZTQueF9wbG90cywgc3RyX3dyYXAoIkZpZ3VyZSA0Lng6IERpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gVVMgYWR1bHRzJyBhbmQgY2hpbGRyZW4ncyBhdHRyaWJ1dGlvbnMgb2YgY29uY2VwdHVhbCB1bml0cyBpbiBTdHVkeSA0LiBGb3IgZWFjaCBjb25jZXB0dWFsIHVuaXQsIHNjb3JlcyBjb3VsZCByYW5nZSBmcm9tIDAtMSwgc3VjaCB0aGF0IGRpZmZlcmVuY2Ugc2NvcmVzIGNvdWxkIHJhbmdlIGZyb20gLTEgdG8gKzEuIEluZGl2aWR1YWwgcGFydGljaXBhbnRzIGFyZSBwbG90dGVkIGFzIHNtYWxsLCB0cmFuc2x1Y2VudCBjaXJjbGVzLCBhbmQgbWVhbiBkaWZmZXJlbmNlIHNjb3JlcyBieSBjaGFyYWN0ZXIgYXJlIHBsb3R0ZWQgYXMgbGFyZ2VyLCBzb2xpZCBkaWFtb25kcy4gRXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBjb25maWRlbmNlIGludGVydmFscy4gVGhlIGRvdHRlZCBsaW5lIGNvcnJlc3BvbmRzIHRvIGVxdWFsIGVuZG9yc2VtZW50cyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgcGxvdHRlZCAoaS5lLiwgYSBkaWZmZXJlbmNlIHNjb3JlIG9mIDApLiIsIDE4MCksIHggPSAwLCBoanVzdCA9IDApCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBULCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMC4zOH0KZ2dkcmF3KGZpZ3VyZTQueF9jYXApCmBgYAoKYGBge3J9CnJlZ3RhYl9zdHVkeTQgPC0gcmVndGFiX2Q0X2FkX3Njb3JlZF9hZF9kaWZmICU+JQogIGZ1bGxfam9pbihyZWd0YWJfZDRfNDZfc2NvcmVkX2FkX2RpZmYpICU+JQogIG11dGF0ZV9hdCh2YXJzKGIsIHMuZS4pLAogICAgICAgICAgICBmdW5zKGZvcm1hdChyb3VuZCguLCBkaWdpdHMgPSAyKSwgbnNtYWxsID0gMikpKSAlPiUKICB1bml0ZShyZXN1bHQsIGIsIHMuZS4sIENJOTUsIG5vbnplcm8pICU+JQogIHNwcmVhZChzdHVkeSwgcmVzdWx0KSAlPiUKICBzZXBhcmF0ZShgQWR1bHRzYCwgYygiczRhX2IiLCAiczRhX3MuZS4iLCAiczRhXzk1JSBDSSIsICJzNGFfbnoiKSwgc2VwID0gIl8iKSAlPiUKICBzZXBhcmF0ZShgQ2hpbGRyZW4sIDQtNXkgKHVzaW5nIGFkdWx0cycgc2NhbGVzKWAsIGMoInM0Yl9iIiwgInM0Yl9zLmUuIiwgInM0Yl85NSUgQ0kiLCAiczRiX256IiksIHNlcCA9ICJfIikKYGBgCgpgYGB7cn0KdGFibGU0LnggPC0gcmVndGFiX3N0dWR5NCAlPiUKICBzZWxlY3QoLXBhaXIsIC1jb250YWlucygicy5lLiIpKSAlPiUKICByZW5hbWUoUGFyYW1ldGVyID0gcGFyYW0pICU+JQogIHJlbmFtZV9hbGwoZnVucyhnc3ViKCJueiIsICIgIiwgLikpKSAlPiUKICByZW5hbWVfYWxsKGZ1bnMoZ3N1YigiczQuXyIsICIiLCAuKSkpICU+JQogIGthYmxlKGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSBjKCJsIiwgcmVwKGMocmVwKCJyIiwgMiksICJsIiksIDMpKSwgCiAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSA0Lng6IFJlZ3Jlc3Npb24gYW5hbHlzZXMgb2YgZGlmZmVyZW5jZSBzY29yZXMgYW1vbmcgVVMgYWR1bHRzIGFuZCBjaGlsZHJlbiAoNC01eSBvZiBhZ2UpIGluIFN0dWR5IDQuIFRoZSB0YWJsZSBwcmVzZW50cyByZXN1bHRzIGZyb20gc2VwYXJhdGUgQmF5ZXNpYW4gcmVncmVzc2lvbnMgb2YgZWFjaCBwYWlyIG9mIGNvbmNlcHR1YWwgdW5pdHMgKEJPRFkgdnMuIEhFQVJULCBCT0RZIHZzLiBNSU5ELCBhbmQgSEVBUlQgdnMuIE1JTkQpLiBFYWNoIHJlZ3Jlc3Npb24gaW5jbHVkZWQgdHdvIGZpeGVkIGVmZmVjdCBwYXJhbWV0ZXJzOiAoMSkgdGhlIGludGVyY2VwdCwgd2hpY2ggSSB0cmVhdCBhcyBhbiBpbmRleCBvZiB0aGUgYXN5bW1ldHJ5IGluIGF0dHJpYnV0aW9ucyBvZiB0aGUgdHdvIGNvbmNlcHR1YWwgdW5pdHMgaW4gcXVlc3Rpb247IGFuZCAoMikgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0IGNoYXJhY3RlcnMsIHJlcG9ydGVkIGhlcmUgYXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJvYm90IGFuZCB0aGUgZ3JhbmQgbWVhbiAoR00pLiBUaGUgaW50ZXJjZXB0cyBhcmUgaGlnaGxpZ2h0ZWQgaW4gYm9sZCwgYmVjYXVzZSB0aGVzZSBhcmUgdGhlIHByaW1hcnkgcGFyYW1ldGVycyBvZiBpbnRlcmVzdCBmb3IgdGhlc2UgYW5hbHlzZXMuIEZvciBlYWNoIHBhcmFtZXRlciwgdGhlIHRhYmxlIGluY2x1ZGVzIHRoZSBlc3RpbWF0ZSAoYikgYW5kIGEgOTUlIGNyZWRpYmxlIGludGVydmFsIGZvciB0aGF0IGVzdGltYXRlLiBBc3Rlcmlza3MgaW5kaWNhdGUgOTUlIGNyZWRpYmxlIGludGVydmFscyB0aGF0IGRvIG5vdCBpbmNsdWRlIDAuIikgJT4lICAKICBrYWJsZV9zdHlsaW5nKCkgJT4lCiAgcm93X3NwZWMoYygxLCAzLCA1KSwgYm9sZCA9IFQpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBIRUFSVCIsIDEsIDIpICU+JQogIGdyb3VwX3Jvd3MoIkJPRFkgLSBNSU5EIiwgMywgNCkgJT4lCiAgZ3JvdXBfcm93cygiSEVBUlQgLSBNSU5EIiwgNSwgNikgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICJBZHVsdHMiID0gMywKICAgICAgICAgICAgICAgICAgICAgIkNoaWxkcmVuLCA0LTZ5ICh1c2luZyBhZHVsdHMnIHNjYWxlcykiID0gMykpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQp0YWJsZTQueApgYGAKCmBgYHtyfQp0YWJsZTQueCA8LSByZWd0YWJfZDRfYWQ0Nl9zY29yZWRfYWRfZGlmZiAlPiUKICBzZWxlY3QoLXBhaXIsIC1zdHVkeSwgLWNvbnRhaW5zKCJzLmUuIikpICU+JQogIG11dGF0ZShiID0gZm9ybWF0KHJvdW5kKGIsIDIpLCBuc21hbGwgPSAyKSkgJT4lCiAgcmVuYW1lKFBhcmFtZXRlciA9IHBhcmFtLAogICAgICAgICBgOTUlIENJYCA9IENJOTUpICU+JQogIHJlbmFtZV9hbGwoZnVucyhnc3ViKCJub256ZXJvIiwgIiAiLCAuKSkpICU+JQogIGthYmxlKGZvcm1hdCA9ICJodG1sIiwgYWxpZ24gPSBjKCJsIiwgcmVwKGMocmVwKCJyIiwgMiksICJsIiksIDMpKSwgCiAgICAgICAgY2FwdGlvbiA9ICJUYWJsZSA0Lng6IFJlZ3Jlc3Npb24gYW5hbHlzZXMgb2YgZGlmZmVyZW5jZXMgaW4gZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBVUyBhZHVsdHMgYW5kIGNoaWxkcmVuICg0LTV5IG9mIGFnZSkgZGlmZmVyZW5jZSBzY29yZXMgaW4gU3R1ZHkgNC4gVGhlIHRhYmxlIHByZXNlbnRzIHJlc3VsdHMgZnJvbSBzZXBhcmF0ZSBCYXllc2lhbiByZWdyZXNzaW9ucyBvZiBlYWNoIHBhaXIgb2YgY29uY2VwdHVhbCB1bml0cyAoQk9EWSB2cy4gSEVBUlQsIEJPRFkgdnMuIE1JTkQsIGFuZCBIRUFSVCB2cy4gTUlORCkuIEVhY2ggcmVncmVzc2lvbiBpbmNsdWRlZCBmb3VyIGZpeGVkIGVmZmVjdCBwYXJhbWV0ZXJzOiAoMSkgdGhlIGludGVyY2VwdCAoZm9yIGFkdWx0cyksIHdoaWNoIEkgdHJlYXQgYXMgYW4gaW5kZXggb2YgdGhlIGFzeW1tZXRyeSBpbiBhdHRyaWJ1dGlvbnMgb2YgdGhlIHR3byBjb25jZXB0dWFsIHVuaXRzIGluIHF1ZXN0aW9uIGFtb25nIGFkdWx0czsgKDIpIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCBjaGFyYWN0ZXJzIChhbW9uZyBhZHVsdHMpLCByZXBvcnRlZCBoZXJlIGFzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByb2JvdCBhbmQgdGhlIGdyYW5kIG1lYW4gKEdNKTsgKDMpIHRoZSBvdmVyYWxsIGRpZmZlcmVuY2UgYmV0d2VlbiBjaGlsZHJlbiBhbmQgYWR1bHRzIChjb2xsYXBzaW5nIGFjcm9zcyB0YXJnZXQgY2hhcmFjdGVycyk7IGFuZCAoNCkgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gdGhpcyBhZ2UgZGlmZmVyZW5jZSBhbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0YXJnZXQgY2hhcmFjdGVycy4gVGhlIGRldmVsb3BtZW50YWwgY29tcGFyaXNvbnMgYXJlIGhpZ2hsaWdodGVkIGluIGJvbGQsIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSBwcmltYXJ5IHBhcmFtZXRlcnMgb2YgaW50ZXJlc3QgZm9yIHRoZXNlIGFuYWx5c2VzLiBGb3IgZWFjaCBwYXJhbWV0ZXIsIHRoZSB0YWJsZSBpbmNsdWRlcyB0aGUgZXN0aW1hdGUgKGIpIGFuZCBhIDk1JSBjcmVkaWJsZSBpbnRlcnZhbCBmb3IgdGhhdCBlc3RpbWF0ZS4gQXN0ZXJpc2tzIGluZGljYXRlIDk1JSBjcmVkaWJsZSBpbnRlcnZhbHMgdGhhdCBkbyBub3QgaW5jbHVkZSAwLiIpICU+JSAgCiAga2FibGVfc3R5bGluZygpICU+JQogIHJvd19zcGVjKHNlcSgyLCAxMiwgMiksIGJvbGQgPSBUKSAlPiUKICBncm91cF9yb3dzKCJCT0RZIC0gSEVBUlQiLCAxLCA0KSAlPiUKICBncm91cF9yb3dzKCJCT0RZIC0gTUlORCIsIDUsIDgpICU+JQogIGdyb3VwX3Jvd3MoIkhFQVJUIC0gTUlORCIsIDksIDEyKSAlPiUKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMSwKICAgICAgICAgICAgICAgICAgICAgIkRldmVsb3BtZW50YWwgY29tcGFyaXNvbiIgPSAzKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CnRhYmxlNC54CmBgYAoKCiMgR2VuZXJhbCBkaXNjdXNzaW9uCgpYWCBfX0lOU0VSVCBHRU5FUkFMIERJU0NVU1NJT05fCgoKIyBDaGFwdGVyIGNvbmNsdXNpb24KCkluIHRoaXMgY2hhcHRlciwgSSBleHBsb3JlZCBhIHNlY29uZCBhc3BlY3Qgb2YgY29uY2VwdHVhbCByZXByZXNlbnRhdGlvbnMgb2YgbWVudGFsIGxpZmUgYW1vbmcgVVMgY2hpbGRyZW4gYW5kIGFkdWx0czogVGhlIHJlbGF0aW9uc2hpcHMgYW1vbmcgY29uY2VwdHVhbCB1bml0cy4gU3R1ZGllcyAyLTQgYXJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgZm9sbG93aW5nIHRoZW9yeTogWFguIAoKQXMgaW4gQ2hhcHRlciBJSUksIEkgdXJnZSB0aGUgcmVhZGVyIHRvIHJlbWVtYmVyIHRoYXQgdGhpcyBpcyBub3QgdGhlIG9ubHkgcG9zc2libGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHBhdHRlcm4gb2YgcmVzdWx0cyBwcmVzZW50ZWQgaGVyZTsgYWRkaXRpb25hbCBzdHVkaWVz4oCUaW4gcGFydGljdWxhciwgc3R1ZGllcyBkZXNpZ25lZCB0byB0ZXN0IHRoZSBoeXBvdGhlc2lzIHRoYXQgWFjigJQgY291bGQgcHJvdmlkZSBjb252ZXJnaW5nIGV2aWRlbmNlIG9yIGNvdWxkIGNoYWxsZW5nZSB0aGlzIHRoZW9yZXRpY2FsIGludGVycHJldGF0aW9uLiBJbnN0ZWFkLCB0aGUgcHJpbWFyeSByb2xlIG9mIHRoZSByZS1hbmFseXNpcyBkaXNjdXNzZWQgaGVyZSBoYXMgYmVlbiB0byBpbnNwaXJlIHRoZSBoeXBvdGhlc2lzIHN0YXRlZCBpbiB0aGUgcHJldmlvdXMgcGFyYWdyYXBoIGFuZCB0byB0aGUgZm91bmRhdGlvbiBmb3IgZnV0dXJlIHRlc3RzIG9mIHRoaXMgaHlwb3RoZXNpcywgaW4gdHVybiByZWZpbmluZyBhIGdlbmVyYWwgdGhlb3J5IG9mIHRoaXMgYXNwZWN0IG9mIGNvbmNlcHR1YWwgZGV2ZWxvcG1lbnQuICAKCkluIHRoZSBuZXh0IGNoYXB0ZXIsIEkgYXBwbHkgdGhlIHNhbWUgZXhwbG9yYXRvcnkgc3Bpcml0IHRvIHRoZSB0aGlyZCBhbmQgZmluYWwgYXNwZWN0IG9mIGNvbmNlcHR1YWwgcmVwcmVzZW50YXRpb25zIG9mIG1lbnRhbCBsaWZlOiB0aGUgYXBwbGljYXRpb24gb3IgZGVwbG95bWVudCBvZiB0aGVzZSBjb25jZXB0dWFsIHVuaXRzIGluIHJlYXNvbmluZyBhYm91dCB2YXJpb3VzIGtpbmRzIG9mIGJlaW5ncy4KCgo=